svn 检出 部署tomcatt应用下有svn文件会不会影响系统效率

114网址导航上班那些事儿(svn插件的使用)
今天,怀着忐忑的心情开始了从事IT行业以后第一天正式上班,到公司后,先办入职,填写各种表格(大公司真麻烦),一连串的手续办完之后,人事把我领到上司处,上司名叫金津,一个年龄比我小,却让我很佩服的小伙子,其实说起来,我们还是校友,津把我带到我自己的专属领地,一眼望去,一堆零散的电脑零件满桌都是,我想这是让我裸工的节奏啊,居然让我从电脑零件组装开始办公,不过为了尽量避免我作为一名IT男显得不专业,我也就没说什么,默默无闻的开始组装起电脑,旁边有两小伙,年纪应该都比我大,一个叫虞晶,一个叫苏群,他们都很热心帮忙,在他们的帮助下,我接着安装系统,安装软件,导入项目等等。
在安装软件的过程中,我总结了一下J2EE开发安装软件的经验:
先装JDK,注意JDK有很多版本,按系统分,有32位的,有64位的,按版本号分,有1.6的,有1.7的等等,很多时候服务器启动报错,都和JDK版本有关,接着安装TOMCAT服务器,(服务器的选择视不同的公司而定),我们用的是汤姆猫,汤姆猫必须建立在JDK的基础之上,如图:
紧接着搭建java的环境变量,安装eclipse,注意eclipse的版本,我们公司使用Eclipse IDE for Java EE
Developers版本,专门用于J2EE企业级开发,然后是eclipse搭建项目管理工具suv和maven,这里只讲svn,maven在下一篇博客中会详细讲到,svn插件一般是在线搭建方式,步骤是:
&&&&&第一步:
方法1、进入工具栏中help选项,选择install new
software,进入下一个对话框,点击右上角按钮add,填写name和location内容,name为subclipse,loction为http://subclipse.tigris.org/update_1.8.x&,如下图:
点击OK,再点击finish,安装完成!
方法2.同样点击help,选择选项eclipse marketplace,在搜索栏中搜索subclipse,如下图:
选择其中一个插件,图片上的第二个,点击install安装,点击finish,完成安装。
方法3.在下载svn压缩包,解压得到圈中的两个文件夹
将插件包features和plugins目录中的文件分别复制到Eclipse安装目录的features和plugins中。然后重启Eclipse
第二步,导项目。
点击eclipse左上角的file选项,选中选项import导入,进入这样一个对话框,如果svn安装成功,如图所示:
选中从svn检出项目,点击next,如图:
如果是第一次导入,你得选中创建新的资源库位置,点击next:
在url中填写你们项目的服务器路径,填写正确后,点击next,这个时候,如果服务器设了账户和密码,你还得填写正确你的账户和密码,填完之后,点击finish,一个项目的导入算是基本结束了。
不过在脱离eclipse的情况下,也可以使用svn,不同的是,要安装svn的安装程序(exe文件),右键点击桌面空白处,你会发现多出两个与svn有关的选项,用于上传和下载,本人因为很少用这种方法,所以需要用到的盆友可以自己去查资料了解。
第三步:管理项目,右键点击项目,你会发现多了一个team选项,与svn项目管理的所有内容都在里面了,这里就不一一阐述了。
至于数据库的安装,我们公司都共享数据库,只要用plsql/developer ping一下就OK,所以就省了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。当前位置: >>
使用ant与svn部署tomcat项目
ant 自动进行远程部署,以及压缩,jar 包等等&project name=&youxiping& default=&build&basedir=&.&&&property name=&cruisecontrol.dir
& location=&E:/cruisecontrol-bin-2.8.4& /& &property name=&artifacts.dir& value=&${cruisecontrol.dir}/artifacts/youxiping&/& &property name=&cc.log.dir& value=&${cruisecontrol.dir}/logs/youriping&/& &property name=&cc.log.cache.dir& value=&${cruisecontrol.dir}/logs/youxiping/_cache&/& &target name=&build& depends=&clean,checkout,php-documentor,pdepend,phpcpd,phpmd,deploy& /& &target name=&init&& &mkdir dir=&src& /& &mkdir dir=&build& /& &mkdir dir=&build/api& /& &mkdir dir=&build/charts& /& &mkdir dir=&build/coverage& /& &mkdir dir=&build/graph& /& &mkdir dir=&build/charts& /& &mkdir dir=&build/logs& /& &exec executable=&svn&& &arg line=&co https://192.168.208.103/svn/PHP/youxiping src& /& &/exec& &/target& &!-The clean target is used to remove build artefacts of previous builds. Otherwise CruiseControl will present old, maybe successful results, even if your build process fails. --& &target name=&clean& depends=&init&& &delete& &fileset dir=&${basedir}/build/logs& includes=&**.*& /& &/delete& &delete& &fileset &/delete& &delete& &fileset &/delete& &delete& &fileset &/delete& &delete& &fileset &/delete& &/target&dir=&${basedir}/build/api& includes=&**.*& /&dir=&${basedir}/build/coverage& includes=&**.*& /&dir=&${basedir}/build/graph& includes=&**.*& /&dir=&${basedir}/build/charts& includes=&**.*& /&&target name=&checkout&& &exec executable=&svn& dir=&${basedir}/src&& &arg line=&up& /& &/exec& &/target& &target name=&php-documentor&& &exec executable=&phpdoc.bat& dir=&${basedir}/&& &arg line=&-ct type -ue on -t ${basedir}/build/api -tb E:/AppServ/php5/data/phpUnderControl/data/phpdoc -o HTML:Phpuc:phpuc -i ${basedir}/src/library/* -d ./src&/& &/exec& &/target& &target name=&pdepend& & &exec executable=&pdepend.bat& dir=&${basedir}/& logerror=&on&& &arg line=&--summary-xml=${basedir}/build/logs/pdepend.xml --jdepend-chart=${basedir}/build/charts/jdepend.svg --overview-pyramid=${basedir}/build/charts/overviewpyramid.svg --coderank-mode=inheritance,property,method --ignore=${basedir}/src/library ./src& /& &/exec& &/target& &target name=&phpcpd& & &exec executable=&phpcpd.bat& failonerror=&false&& &arg line=&--log-pmd ${basedir}/build/logs/pmd-cpd.xml --exclude ${basedir}/src/class --exclude ${basedir}/src/library --exclude ${basedir}/src/templates_c ${basedir}/src & /& &/exec& &/target& &target name=&phpmd&& &exec executable=&phpmd.bat& dir=&${basedir}/&& &arg line=&./src xml unusedcode --reportfile ${basedir}/build/logs/pmd.xml --exclude class,templates_c,library&/& &/exec& &/target& &target name=&deploy& depends=&checkout&&&property name=&server.ftp.userid& value=&wanglihui&/& &property name=&server.ftp.password& value=&time9818&/& &property name=&server.ftp.address& value=&116.213.65.35&/& &ftp server=&${server.ftp.address}& port=&21& userid=&${server.ftp.userid}& password=&${server.ftp.password}& remotedir=&youxiping1&& &fileset dir=&${basedir}/src& excludes=&**/.svn/**,**/.settings/**&/& &/ftp& &!--copy todir=&${apache.local}/qiandaiTest/scripts&& &fileset dir=&${js.dist.dir}& /& &/copy& &copy todir=&${apache.local}/qiandaiTest/style&& &fileset dir=&${css.dist.dir}& /& &/copy--& &/target& &tstamp& &format property=&del.artifacts.time& ffset=&-2& unit=&week& /& &/tstamp&pattern=&yyyyMMddHHmmss& &target name=&del.artifacts&& &echo message=&==== delete artifacts before ${del.artifacts.time} ====&/& &delete dir=&${artifacts.dir}& includeemptydirs=&true&& &date when=&before& datetime=&${del.artifacts.time}& pattern=&yyyyMMddHHmmss& /& &/delete& &delete dir=&${cc.log.dir}& includeemptydirs=&true&& &date when=&before& datetime=&${del.artifacts.time}& pattern=&yyyyMMddHHmmss& /& &/delete& &delete dir=&${cc.log.cache.dir}& includeemptydirs=&true&& &date when=&before& datetime=&${del.artifacts.time}& pattern=&yyyyMMddHHmmss& /& &/delete& &/target& &/project&使用 ant 更新 svn 代码打包 并远程部署 tomcat第一步:安装 ant、安装 tomcat、svnant(svnant-1.2.1.zip) ant(apache-ant-1.8.2)和 tomcat(apache-tomcat-5.5.27)选择解压版,使用方 便 配置 ant 环境变量 在系统环境 path 中加入%PATH%=D:\apache-ant-1.8.2\%PATH% 第二步:新建一个自动打包部署的文件夹,例如:ant_datachange 第三步:在编译 bs 程序是,我们需要指定 j2ee 类库,例如 javaee.jar 等 第四步:运行该 Ant 脚本时,一定要将随 SVN Ant 任务一起提供的 JARs ―svnant.jar、svnClientAdapter.jar 和 svnjavahl.jar― 包含在您的类路径 中。 第 五 步 : ant 远 程 部 署 tomcat 是 需 要 在 客 户 端 配 置 , 将 服 务 端 的 ${CATALINA_HOME}/lib/catalina-ant.jar 拷贝到客户端的${ANT_HOME}/lib 目 录下 第六步:在 tomcat 服务器端,我们主要通过 tomcat manager api 来完成部署工 作,这个需要权限,所以你的修改 $CATALINA_HOME/conf/tomcat-users.xml 加入 &user name=&admin& password=&admin& roles=&manager& /& 你可以通过手动访问下面的地址http://127.0.0.1/manager/html如果成功,说明你的服务端配置正确第七步:客户端脚本 build.xml &?xml version=&1.0& encoding=&UTF-8&?& &!-- edited with XMLSPY v5 rel. 3 U () by TEAM (strong) --& &!-===================================================================== =
check description 数据交换系统打包部署 Administrator ================================================================ ====== --& &project name=&deploy& default=&default& basedir=&.&& &path id=&project.classpath&& &fileset dir=&lib&& &include name=&**/*.jar&/& &/fileset& &/path& &description&数据交换系统部署&/description& &!--svn 上源码路径--& &property name=&dataexchange_src& value=&http://192.168.1.1:8888/svn/data_exchange2/1.development_wareh ouse/a.development/source/datachange/src&/& &!--svn 上 WEB-INF 路径--& &property name=&dataexchange_web_inf& value=&http://192.168.1.1:8888/svn/data_exchange2/1.development_wareh ouse/a.development/source/datachange/datachange/WEB-INF&/& &!--svn 上 web 根目录路径--& &property name=&dataexchange_web_root& value=&http://192.168.1.1:8888/svn/data_exchange2/1.development_wareh ouse/a.development/source/datachange/datachange&/& &!--svn 上账号及密码 --& &property name=&svn_User& value=&abc&/& &property name=&svn_Password& value=&*******&/& &!--部署后 web 模块名 --& &property name=&deploy_ModelName& value=&dataexchange&/& &!--Javadocs 属性--& &property name=&packages& value=&com.strongit.*&/& &property name=&build.src& value=&./src&/& &property name=&build.javadocs& value=&./docs&/& &property name=&Name& value=&数据交换系统&/& &!--版本号采用时间戳来约定--& &property name=&lableNum& value=&Build.${timeSign}&/& &!--任务目标--& &target name=&default& depends=&deploy&/& &!--版本号采用时间戳来约定--& &target name=&verTimeSign&& &tstamp& &format property=&timeSign& pattern=&yyyyMMddHHmm&/& &/tstamp& &/target& &target name=&prinLable& depends=&verTimeSign&& &vsslabel vsspath=&${salary-web-root}& login=&${vss_UserAndPassword}& ssdir=&${vss_dir}& serverPath=&${vss_server_path}& label=&Build.${timeSign}& autoresponse=&Y&/& &/target& &!--打包 --& &target name=&package& depends=&compile,verTimeSign&& &zip destfile=&./${deploy_ModelName}${timeSign}.war& basedir=&./WebRoot&/& &/target& &!--编译程序 --& &target name=&compile& depends=&checkout&& &copy todir=&./WebRoot/WEB-INF/classes&& &fileset dir=&./src&& &include name=&**/*&/& &exclude name=&**/*.java&/& &/fileset& &/copy& &echo message=&编译系统&/& &!--executable 的路径为服务器上的 JDK1.5 的路径 --& &javac srcdir=&./src& fork=&true& executable=&C:\Program Files\Java\jdk1.6.0_10\bin\javac.exe& compiler=&javac1.5& destdir=&./WebRoot/WEB-INF/classes& encoding=&utf-8& memorymaximumsize=&1024M&& &classpath& &fileset dir=&./WebRoot/WEB-INF/lib&& &include name=&*.jar&/& &/fileset& &fileset dir=&./j2eelib&& &include name=&*.jar&/& &/fileset& &/classpath& &/javac& &!-&javadoc destdir=&./docs& author=&true& access=&private& charset=&utf-8& encoding=&utf-8& doctitle=&${Name}&& &package name=&com.strongit.*&/& &sourcepath location=&./src&/& &/javadoc& → &/target& &!--从当前目录清除已存在的文件--& &target name=&clean& depends=&deleteTmp&& &delete dir=&./src&/& &delete dir=&./WebRoot&/& &!-&delete file=&./${deploy_ModelName}.war&/& &delete dir=&./docs&/& --& &/target& &target name=&deleteTmp&& &delete dir=&./dataexchange_src&/& &delete dir=&./dataexchange_WebRoot&/& &/target& &taskdef name=&svn& classname=&org.tigris.subversion.svnant.SvnTask& classpathref=&project.classpath&/& &typedef resource=&org/tigris/subversion/svnant/svnantlib.xml& classpath=&svnant.jar&/& &!--将本地临时目录的文件汇总到 WebRoot 和 src 目录,并删除临时目录--& &target name=&checkout& depends=&export&& &move todir=&./WebRoot&& &fileset dir=&./dataexchange_WebRoot&& &exclude name=&**/*.scc&/& &/fileset& &/move& &move todir=&./src&& &fileset dir=&./dataexchange_src&& &exclude name=&**/*.scc&/& &/fileset& &/move& &echo message=&删除临时目录&/& &antcall target=&deleteTmp&/& &/target& &!-- 将 svn 上的文件拉到本地 --& &target name=&export& depends=&clean&& &svn javahl=&true& username=&${svn_User}& password=&${svn_Password}& failonerror=&true&& &!--Get dataexchange File--& &export srcUrl=&${dataexchange_web_root}& destPath=&./dataexchange_WebRoot& revision=&HEAD&/& &!--Get Src Source --& &export srcUrl=&${dataexchange_src}& destPath=&./dataexchange_src& revision=&HEAD&/& &/svn& &/target& &!-- 部署目录 --& &!-- Configure the context path for this application --& &property name=&path& value=&/fees& /& &!-- Configure properties to access the Manager application --& &property name=&url& value=&http://127.0.0.1:8080/manager& /& &property name=&username& value=&admin& /& &property name=&password& value=&admin& /& &!-- Configure the custom Ant tasks for the Manager application --& &taskdef name=&deploy& classname=&org.apache.catalina.ant.DeployTask& /& &taskdef name=&undeploy& classname=&org.apache.catalina.ant.UndeployTask& /& &target name=&deploy& description=&Install web application& depends=&package&& &deploy url=&${url}& username=&${username}& password=&${password}& path=&${path}& war=&./${deploy_ModelName}${timeSign}.war& /& &/target&&target name=&undeploy& description=&Remove web application&& &undeploy url=&${url}& username=&${username}& password=&${password}& path=&${path}& /& &/target&&/project& 打包.bat set ANT_OPTS=-Xms64m -Xmx512m -verbosegc @ant第八步:运行 第一次部署 结果:
22:35:59 org.apache.catalina.startup.HostConfig deployWAR 信息: Deploying web application archive search.war
22:36:03,595 INFO XmlConfigurationProvider - Parsing configuration file [struts-default.xml]
22:36:03,887 INFO XmlConfigurationProvider - Parsing configuration file [struts-plugin.xml]
22:36:03,923 INFO XmlConfigurationProvider - Parsing configuration file [struts.xml]
22:36:04,140 INFO ObjectTypeDeterminerFactory - Detected GenericsObjectTypeDeterminer, initializing it...
22:36:04,146 INFO XWorkConverter - Detected AnnotationXWorkConverter, initializing it... 成功 第二次部署出现错误: deploy: [deploy] FAIL - Application already exists at path /search 于是将 &target name=&deploy& description=&Install web application& depends=&war&& 。。。。 。。。。 &/target& 变为 &target name=&deploy& description=&Install web application& depends=&war,undeploy&& 。。。。 。。。。 &/target& 结果: 信息: Undeploying context [/search]
22:46:27 org.apache.catalina.startup.HostConfig deployWAR 信息: Deploying web application archive search.war
22:46:29,926 INFO XmlConfigurationProvider - Parsing configuration file [struts-default.xml]
22:46:30,048 INFO XmlConfigurationProvider - Parsing configuration file [struts-plugin.xml]
22:46:30,083 INFO XmlConfigurationProvider - Parsing configuration file [struts.xml]
22:46:30,250 INFO ObjectTypeDeterminerFactory - DetectedGenericsObjectTypeDeterminer, initializing it...
22:46:30,252 INFO XWorkConverter - Detected AnnotationXWorkConverter, initializing it... 成功 相关下载 / 总结: 本文主要通过 ant 脚本来远程部署 tomcat,旨在做一个尝试,上面的脚本与这 种部署方式都与实际的环境相差甚远, 这种部署方式适合服务器和客户端没有程 序配置差别的应用,一旦有了程序配置差别,这种方式就不合适了,你可以考虑 采用在服务器段进行本地部署消除这种差别 (对于复杂的部署环境也许是两者的 结合) ,这样也有利于持续构建。 Jenkins+Maven+SVN 搭建自动部署,自动 测试环境Jenkins+Maven+SVN 搭建自动部署, 自动测试环 境writen by Tony Jiang@tokyo《目录》 一、安装 Jenkins 二、配置 Jenkins 三、自动编译 四、自动测试 五、自动部署一、安装 Jenkins 地址 http://mirrors.jenkins-ci.org/下载适合的 Jenkins 版本。 Windows最 新 稳 定 版 的 Jenkins http://mirrors.jenkins-ci.org/windows-stable/jenkins-1.409.1.zip 地 址 为 :把 Jenkins 1.409.1 版解压,把得到的 war 包直接扔到 tomcat 下,启动 tomcat, Jenkins 就安装完毕,是不是很简单啊。 二、配置 Jenkins 1、打开 http://10.3.15.78:8080/jenkins/,第一次进入里面没有数据,我们需要创建 job, 我们这有 2 个项目,需要创建 2 个 job。http://10.3.34.163:9890/jenkins/2、点击左上角的 new job,在 new job 页面需要选择 job 的类型,Jenkins 支持几种类型,我们选择“构建一个 maven2/3 项目”3、点击 OK 按钮后,进会进入详细配置界面,详细配置界面的配置项很多,不过不用怕,大部分使用默认配置就可以了,下面就说说我们需要修改的几个地方:3.1)Source Code Management 因为我们使用 SVN 管理源码,所以这里选择 Subversion,并在 Repository URL 中输入我们的 SVN 地址:http://10.3.34.163:9880/XXXX/trunk/输入 SVN 库的 URL 地址后,Jenkins 会自动验证地址,并给予提示。点击红色字体部分的 enter credential 链接,进入页面设置好访问 SVN 库的用户名和密码后,点击 OK 按钮设置成功。点击 Close 按钮,返回之前的 Source Code Management 页面。此时 不再有红色警告信息了。3.2) 配置自动构建的计划, 假设我们想让项目中每天 12 点和晚上 8 点自动构建 一次,只需要在 Build Triggers 中选择 Build periodically,并在 Schedule 中 输入 0 12,20 * * *。 我配置的是每晚 8 点自动构建注:Schedule 的配置规则是有 5 个空格隔开的字符组成,从左到右分别代表: 分时天月年。*代表所有,0 12,20 * * * 表示D在任何年任何月任何天的 12 和 20 点 0 分‖进行构建。 3.3)配置到这里,可能有人发现在 Build 配置节点,有红色错误信息,提示 Jenkins needs to know where your Maven2 is installed. Please do so from the system configuration. 是因为 Jenkins 找不到 maven 的原因,点击&system configuration&,是 system configuration 的 maven 配置中添加 maven 目录就 OK,如下图:我设置了 JRE 6 和 MAVEN 3 的安装目录。 点击左下角的 SAVE 按钮,保存设置。 3.4)保存好所有配置后,我们第 1 个 job 就算是完成了。 3.5)创建第 2 个 job,配置和上面的配置相同。只需把 svn 地址改成:http://localhost/svn/Web三、自动编译 在经过上面的配置后,回到 Jenkins 首页,在首页可以看到刚才添加的 2 个 job点击某 1 个 job 后后面的&Schedule a build&图片手动构建,点击完后,会在左边 的 Build Queue 或者 Build Executor Status 显示正在构建的任务, 在自动构建完后, 刷新页面,就可以看到构建结果了,如何某个项目构建失败,点击项目后面的构 建数字(从 1 开始递增)进入项目的&Console Output &可以查看项目构建失败的原 因。当然我们也可以配置把构建失败的结果发到邮箱。 到目前为止,1 个简单的自动构建环境就搭建好了,很简单吧。四、自动测试 在 maven 的 pom.xml 中配置 test resouce 和 test class。 在 Jenkins 中新建一个 mvn batch,如下[html] view plaincopyprint? 1. :@echo off 2. 3. setlocal 4. 5. set my.dir=%CD:~-11% 6. 7. if not &%my.dir%& == &\myproject& goto lerr1 8. 9. goto lgo 10. 11. :lerr1 12. 13. echo do at myproject directory 14. 15. goto lend 16. 17. :lgo 18. 19. call mvn clean 20. 21. call mvn test 22. 23. :lend 24. 25. endlocal :@echo off setlocal set my.dir=%CD:~-11% if not &%my.dir%& == &\myproject& goto lerr1 goto lgo :lerr1 echo do at myproject directory goto lend :lgo call mvn clean call mvn test :lend endlocal启动之后,就可以自动测试所有的 Junit 五、自动部署 看完上面发现 Jenkins 配置真的很简单,几分钟就搭建好自动构建环境,但环境 搭建好后发现 1 个问题,现在是能自动构建了,但是构建好的 web.war 都还是 在 Jenkins 目录下,并没有发布到 tomcat 中,还需要手动 copy 过去? 这是个问题,不过别急,要达到自动部署的目的,需要安装 1 个 Jenkins 的部署 插件。选择D系统管理‖菜单的D管理插件‖:选择D可选插件‖,找到 Deploy Plugin 1.8 插件,选择并安装它。 注:Deploy Plugin 1.8 插件支持 Tomcat 4.x/5.x/6.x/7.x ,JBoss 3.x/4.x , Glassfish 2.x/3.x 点击底部的D安装‖按钮,耐心等待,直到 Deploy Plugin 完成,显示 Success。 选择框打钩,Jenkins 会自动重启:此时,在插件管理的D已安装‖Tab 页,可以看到部署插件已安装完毕。重新进入 web 的 configure 配置界面,在最下面会发现多处 1 个配置项,让我 们配置 tomcat 的基本信息注:war file 使用的是 Jenkinsworkspace 的相对目录,hudon 默认的目录在: C:\Documents and Settings\用户名\.Jenkins\ workspace 目 录 : C:\Documents jobs\web\workspace\ and Settings\ 用 户 名 \.Jenkins\最 终 产 生 的 war 在 : C:\Documents and Settings\ 用 户 名 \.Jenkins\ jobs\web\workspace\Web\target\web.war注:可支持远程部署,用 Jenkins 做部署机器,和运营机器分开管理 保存配置再重新构建一次,打开 tomcat 的 webapps 目录,发现 web.war 终于 过来了,大功告成。#以上# svn 自动部署到 web 服务器设置问题我的需求是这样的,我客户端装在 windows 上,服务端在 linux 上,我现在想在客户端更改 html 文件后,可以自动部署到 linux 下的 /opt/web tomcat 目录下,我怎么配置呢?网上有一 段代码更改 post-commit#!/bin/sh REPOS=&$1& REV=&$2& WEB=/opt/web export LANG=zh_CN.UTF-8 svn update $WEB --username admin --password 123456 --no-auth-cache但说得不清楚,好像是客户端和服务端在同一台机器吧,而且我想用指定目录下的文件到 tomcat 目录下,并不是所有的目录都要部署到 tomcat 下,有高手在吗?越详细越好,回答 好,加 400 分。修改服务器上的钩子程序 post-commit,将指定要发布的内容的文件夹导出(export)到 tomcat 目录下就行了 钩子程序 post-commit 是在执行 commit 操作后自动执行的,这样每次 commit 后都自动执 行一次导出操作,保持 tomcat 文件夹内容就是所要发布的内容 -------------------------------------------------------------------------补充: 例如你版本库的 svn 访问地址是 http://10.30.11.12:8080/svn/project1,你想把这 个版本库下的/trunk/web 文件夹发布到 tomcat 上,发布到 tomcat 的文件夹地址是 d:/tomcat/opt/web,svn 的管理员用户名是 abc,密码是 12345,那么这个钩子程序应该 就是: svn export http://10.30.11.12:8080/svn/project1/trunk/web --force --username abc --password 12345d:/tomcat/opt/web --no-auth-cache (本人对 linux 不熟悉,这行指令如有与 linux 语法不一致的地方,请参考原理自行修改) 说明: 1、 --force 是说强制覆盖 d:/tomcat/opt/web 这个文件夹, 避免这个文件夹不为空时报错 2、--username abc --password 12345 是自动将用户名和密码作为参数传送进去 3、--no-auth-cache 是说不缓存用户名和密码,这是出于安全考虑 4、svn export 是将所指定的 url 的内容导出到所指定的文件夹去。这里之所以不用 update 而用 export,是因为 update 会导致生成一个隐藏.svn 文件夹,这个文件夹是我们不需要的当然了,如果整个发布的内容很多的话,建议还是用 update,而不用 export,因为 update 只 更新有变化的部分,而 export 将重新导出所有内容,网络消耗比 update 大。你把文件放在对应的文件下更新就 OK 了,另外你要把你的 Tomcat 的配置文件更改下, Tomcat\conf 下的 web.xml 文件里的&servlet& &servlet-name&jsp&/servlet-name& &servlet-class&org.apache.jasper.servlet.JspServlet&/servlet-class& &init-param& &param-name&fork&/param-name& &param-value&false&/param-value& &/init-param& &init-param& &param-name&development&/param-name& &param-value&false&/param-value& &/init-param& 这段代码里的&param-name&development&/param-name&&param-value&false&/param-value&把 false 改成 true 就 OK 了。 使用 ANT+SVN 在 Linux 上实现自动部署项 目使用 ANT+SVN 在 Linux 上实现自动部署项目build.xml[html] 1.&?xml version=&1.0& encoding=&UTF-8&?& 2. 3.&project basedir=&.& default=&main& name=&Yuxi HDFS&& 4. 5. 6. 7. 8.&!-9. 10. 11. &path id=&svnant.classpath&& &pathelement location=&/usr/local/ant/lib/svnkit.jar&/& &pathelement location=&/usr/local/ant/lib/svnant.jar&/& &path id=&project.classpath&& &pathelement location=&/root/YuxiHDFS/WEB-INF/lib/Hadoop-core-1.0.0.jar&/& &pathelement location=&/root/YuxiHDFS/WEB-INF/lib/commons-logging-1.1.1.jar&/& &/path& 12. 13. 14.&pathelement location=&/usr/local/ant/lib/svnjavahl.jar&/& &pathelement location=&/usr/local/ant/lib/svnClientAdapter.jar&/& &/path&15. &typedef resource=&org/tigris/subversion/svnant/svnantlib.xml& classpathref=&svnant.classpath&/& 16.--& 17. &typedef resource=&org/tigris/subversion/svnant/svnantlib.xml& classpath=&svnant.jar& /& 18. &svnSetting id=&svn.settings& javahl=&false& svnkit=&true& username=&user1& password=&passwd& /& 19. 20. 21. &target name=&svn&& &echo message=&checkout source code& /& &svn refid=&svn.settings&&22. &checkout url=&svn://192.168.11.124/repos/YuxiHDFS& destPath=&/root/YuxiHDFS&/& 23. 24. 25. 26. &/svn& &/target& &target name=&compile& depends=&svn&& &mkdir dir=&/root/YuxiHDFS/build&/&27. &javac debug=&true& debuglevel=&source,lines,vars& destdir=&/root/YuxiHDFS/build& source=&1.6& target=&1.6& includeantruntime=&on&& 28. 29. 30. 31. 32. 33. &classpath refid=&project.classpath&/& &src path=&/root/YuxiHDFS/src&/& &/javac& &/target& &target name=&compress& depends=&compile&& &mkdir dir=&/root/YuxiHDFS/dist&/& 34. &jar jarfile=&/root/YuxiHDFS/dist/lib/yuxi_hdfs-1.0.0.jar& basedir=&/root/YuxiHDFS/build&& 35. 36. 37. 38. 39. &include name=&com/yuxipacific/**/*.class&/& &manifest& &attribute name=&YuxiHDFS-Version& value=&1.0&/& &/manifest& &/jar&40. &war destfile=&/root/YuxiHDFS/dist/YuxiHDFS.war& webxml=&/root/YuxiHDFS/WEB-INF/web.xml&& 41. /& 42. 43. 44. 45. 46. 47. 48. 49. &webinf dir=&/root/YuxiHDFS/WEB-INF/& includes=&applicationContext.xml&&lib dir=&/root/YuxiHDFS/WEB-INF/lib&/& &lib dir=&/root/YuxiHDFS/dist/lib&/& &/war& &/target& &target name=&deploy& depends=&compress&& &echo message=&stop tomcat server& /& &exec executable=&/usr/local/tomcat/bin/shutdown.sh& /& &delete dir=&/usr/local/tomcat/webapps/YuxiHDFS&/&50. &copy file=&/root/YuxiHDFS/dist/YuxiHDFS.war& todir=&/usr/local/tomcat/webapps&/& 51. 52. 53. 54. &echo message=&start tomcat server& /& &exec executable=&/usr/local/tomcat/bin/startup.sh& /& &/target& &target name=&main& depends=&deploy&& 55. 56.&delete dir=&/root/YuxiHDFS&/& &/target&57.&/project&B/S 实现远程配置 SVN最近在尝试做一个类似 sourceforge 的开源社区,因此需要为项目申请者提供远程 SVN 的配 置。这里列出自己的代码和心得,一是为了与大家相互交流,更重要的是为了让各位提提意 见,看看还需要什么内容。 现在提供的功能有: 为项目创建 svn 仓库,修改 svn 账户密码,修改 svn 权限配置等。 大家觉得还需要什么呢? 代码如下: 首先定义一个异常:package commandLineT class SvnException extends Exception { public SvnException(String s) { super(s); } }下面是对 svn 的操作:package commandLineT import java.io.BufferedR import java.io.BufferedW import java.io.F import java.io.FileNotFoundE import java.io.FileR import java.io.FileW import java.io.IOE import java.io.InputStreamR public class SvnCommander { private String svn_home = &K:/subversion-repository/&; /** *//** * 为指定项目在服务器创建 svn 仓库,当用户选择开通 svn 服务时,这个方法将被调用为用户的 项目创建 svn 仓库 * * @param project * * */ public void createRepository(String project) throws SvnException { try { Process p = new ProcessBuilder(&svnadmin&, &create&, svn_home + project).start(); StringBuffer buffer = new StringBuffer(); S // BufferedReader reader=new BufferedReader(new // InputStreamReader(p.getInputStream())); // while((tmp=reader.readLine())!=null) // buffer.append(tmp); // System.out.println(buffer.toString()); // buffer=new StringBuffer(); BufferedReader reader = new BufferedReader(new InputStreamReader(p .getErrorStream())); while ((tmp = reader.readLine()) != null) buffer.append(tmp); // System.err.println(buffer.toString()); if (buffer.length() & 0) throw new SvnException(buffer.toString()); initSvnServer(project); initAuthz(project); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); 需要创建 svn 仓库的项目的名称 当创建失败时将抛出错误 * @throws SvnException } } /** *//** * 用 于 修 改 svn 仓 库 的 svnserve.conf 配 置 文 件 , 这 个 方 法 将 在 @link createRepository(String name) * 中被自动调用,不建议被其他类调用 * * @param project * * */ public void initSvnServer(String project) throws SvnException { File svnserve = new File(svn_home + project + &/conf/svnserve.conf&); try { BufferedReader reader = new BufferedReader(new FileReader(svnserve)); StringBuffer buffer = new StringBuffer(); S while ((tmp = reader.readLine()) != null) buffer.append(tmp + &\n&); reader.close(); int index = buffer.indexOf(&# anon&); buffer.delete(index, index + 2); index = buffer.indexOf(&# auth&); buffer.delete(index, index + 2); index = buffer.indexOf(&# pass&); buffer.delete(index, index + 2); index = buffer.indexOf(&# auth&); buffer.delete(index, index + 2); BufferedWriter writer = new BufferedWriter(new FileWriter(svnserve)); writer.write(buffer.toString()); writer.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block throw new SvnException(&SvnException: 配置文件 svnserve.conf 未找到: & + e.toString()); } catch (IOException e) { // TODO Auto-generated catch block throw new SvnException(&SvnException: 配置文件 svnserve.conf 的 io 操作出现问题: & + e.toString()); } svn 仓库对应的项目名称 当用户所在的项目并没有开通 svn 服务,或者修改 svnserve.conf 文件出现 io 错误时将 * @throws SvnException 抛出 SvnException } /** *//** * 为用户设置 svn 帐户的密码, * 该方法将修改项目仓库的 passwd 文件,如果该用户帐户已存在于 passwd 文件中,将修改其密 码信息;如果不存在,则会在 passwd 添加新的记录 * * @param project * * * * */ public void setPassword(String project, String name, String key) throws SvnException { File file = new File(svn_home + project); if (!file.exists()) throw new SvnException(&SvnException: 该项目还未开通 svn 服务&); File passwd = new File(svn_home + project + &/conf/passwd&); try { BufferedReader reader = new BufferedReader(new FileReader(passwd)); StringBuffer buffer = new StringBuffer(); S while ((tmp = reader.readLine()) != null) buffer.append(tmp + &\n&); reader.close(); int index = buffer.indexOf(name + & = &); if (index != -1) { int line_end = buffer.indexOf(&\n&, index); if (line_end == -1) line_end = buffer.length(); buffer.replace(index + name.length() + 3, line_end, key); } else { buffer.append(name + & = & + key); } BufferedWriter writer = new BufferedWriter(new FileWriter(passwd)); writer.write(buffer.toString()); writer.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block 用户所在的项目名称 用户帐户名称 用户密码 当用户所在的项目并没有开通 svn 服务,或者修改 passwd 文件出现 io 错误时将抛出 * @param name * @param key * @throws SvnException SvnException throw new SvnException(&SvnException: 配置文件 passwd 未找到: & + e.toString()); } catch (IOException e) { // TODO Auto-generated catch block throw new SvnException(&SvnException: 配置文件 passwd 的 io 操作出现问题: & + e.toString()); } } private void initAuthz(String project) throws SvnException { File template = new File(&authz_template.txt&); File authz = new File(svn_home + project + &/conf/authz&); try { BufferedReader reader = new BufferedReader(new FileReader(template)); BufferedWriter writer = new BufferedWriter(new FileWriter(authz)); S while ((tmp = reader.readLine()) != null) writer.write(tmp); reader.close(); writer.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block throw new SvnException(&SvnException: 配置文件 passwd 未找到: & + e.toString()); } catch (IOException e) { // TODO Auto-generated catch block throw new SvnException(&SvnException: 配置文件 passwd 的 io 操作出现问题: & + e.toString()); } } /** *//** * 用于设置各个用户对 svn 的使用权限 * * @param project * * * * */ public void setAuthz(String project, String path, String name, String right) 对应的项目名称 权限对应的文件夹,该参数应该采取&/foo/bar&的形式,不然设置结果将不起作用 用户名称,全部用户应该使用&*&来表示 权限,为&r&或者&rw&两种形式 * @param path * @param name * @param right throws SvnException { File passwd = new File(svn_home + project + &/conf/authz&); try { BufferedReader reader = new BufferedReader(new FileReader(passwd)); StringBuffer buffer = new StringBuffer(); S while ((tmp = reader.readLine()) != null) buffer.append(tmp + &\n&); reader.close(); int begin = buffer.indexOf(&[& + project + &:& + path + &]&); System.err.println(begin); if (begin != -1) { int end = buffer.indexOf(&[& + project, begin+1); System.err.println(end); if (end == -1) end = buffer.length(); int index = buffer.indexOf(name, begin); System.err.println(index); if (index & end && index != -1) { int line_end = buffer.indexOf(&\n&, index); if (line_end == -1) line_end = buffer.length(); buffer.replace(index + name.length() + 3, line_end, right); } else { int line_end = buffer.indexOf(&\n&, begin); if (line_end == -1) line_end = buffer.length(); buffer.insert(line_end + 1, name + & = & + right + &\n&); } } else { buffer.append(&[& + project + &:& + path + &]\n&); buffer.append(name + & = & + right + &\n&); } BufferedWriter writer = new BufferedWriter(new FileWriter(passwd)); writer.write(buffer.toString()); writer.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block throw new SvnException(&SvnException: 配置文件 authz 未找到: & + e.toString()); } catch (IOException e) { // TODO Auto-generated catch block throw new SvnException(&SvnException: 配置文件 authz 的 io 操作出现问题: & + e.toString()); } } /** *//** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub SvnCommander s = new SvnCommander(); // // // // // // // // // // // // } try { s.setPassword(&lala&, &td&, &&); } catch (SvnException e) { // TODO Auto-generated catch block System.err.print(e.toString()); } try { s.setAuthz(&lala&,&/&,&haha&,&rw&); } catch (SvnException e) { // TODO Auto-generated catch block System.err.print(e.toString()); } } } try { s.createRepository(&lala&); } catch (SvnException e) { // TODO Auto-generated catch block System.err.print(e.toString());创建 svn 仓库是通过调用 Process p = new ProcessBuilder(&svnadmin&, &create&, svn_home + project).start(); 进行的。同时捕捉系统的返回查看是否有异常 BufferedReader reader = new BufferedReader(new InputStreamReader(p .getErrorStream())); while ((tmp = reader.readLine()) != null) buffer.append(tmp); // System.err.println(buffer.toString()); if (buffer.length() & 0) throw new SvnException(buffer.toString()); 而对密码和权限的修改是通过对 svn 默认的 passwd 以及 authz 文件进行文本操作。 另外既然是 b/s 模式当然有显示的页面,碍于篇幅就不详述咯 最后,有两个问题还想请问各位: 1.对文本的操作难道只能读入内存修改后重新写入吗?有没有比较高效的方法呢? 2.还需要什么额外的功能?因为 svn 的一些基本操作(如导入导出)其实通过 svn 客户端访 问 svn 地址就可以了svn+post-commit 实现自动部署一、安装 #yum install subversion 检查是否安装了 svn #subversion Cv 创建 svn 库和对应的目录 #mkdir /svn/ #svnadmin create /svn/ 二、配置 创建登录 svn 的用户和密码 #vim /svn//conf/passwd [users] 用户名=密码 设置 svn 用户权限 #vim /svn//conf/authz [/] 用户名=rw 设置 svn 主配置文件 #vim /svn//conf/ anon-access=none #使非授权用户无法访问 auth-access=write #使授权用户有写权限 password-db=password authz-db=authz #启用访问控制文件 realm=/svn/ #认证命名空间,subversion 会在认证提示里显示,并且作为凭证缓 存的关键字。 启用 svn:#svnserve Cd Cr /svn/ 注可以用―listen-port 参数修改 svn 的端口 三、连接 svn 1、linux 主机连接 svn #svn co svn://192.168.1.180 输入用户名和密码后就可以将 svn 上的数据下载到本地。 2、windows 主机连接 svn 利用 TortoiseSVN 工具进行连接。 四、利用 svn 的 post-commit 将 svn 服务器的文件同步更新到固定的目录 #cd /svn//hooks #cp post-commit.tmpl post-commit #chmod a+x post-commit 编辑 post-commit 钩子脚本 #vim post-commit export LANG=zh_CN.UTF-8 #设定环境变量,如果没有设定可能会出现 update 报错 SVN=/usr/bin/svn WEB=/usr/local/apache/htdocs/192.168.1.180 ${SVN} update ${WEB} --username rsync --password rsync 注:WEB 中指定的目录不能为空目录,需要先 checkout 报错注解,及解决办法: 1、 svn: Error converting entry in directory '/usr/local/apache/htdocs/192.168.1.180' to UTF-8 svn: Can't convert string from native encoding to 'UTF-8': svn: ?\229?\164?\141?\228?\187?\182 ?\229?\164?\141?\228?\187?\182 ?\229?\164?\141?\228?\1 87?\182 ?\229?\164?\141?\228?\187?\182 rsync-3.0.9.tar.gz 原因:svn 服务器上的文件存在编码为 UTF-8 的文件,如果服务器不支持 UTF-8 编码就会 报这个错误。 解决办法:在 post-commit 钩子脚本中,添加 export LANG=zh_CN.UTF-8 字段,更改环境变 量中的编码。 2、 Skipped '/usr/local/apache/htdocs/192.168.1.180' 这个时候使用命令 svn update 命令会提示 Skipped ?.‘ 原因:192.168.1.180 是一个空目录或这个目录不存在 解决办法:先进行手工的 checkout,之后再 post-commit 中将目录指定到 checkout 的目录, 就解决了。TortoiseSVN 简明使用先介绍下什么是 SubVersion,Subversion 是新一代的版本控制工具,不仅可以管理程序源代 码,也可以应用于其他协作管理数据的工作。 安装你 可 以 从 TortoiseSVN 官 方 站 点 下 载 最 新 版 的 TortoiseSVN , 中 文 汉 化 包 可 以 从 SubVersion 中文站下载。下载之后,点击安装包,一路 next 下去即可。下载项目在你硬盘的适当的位置,点击邮件,选择 SVN Checkout…然后就会弹出一个 Checkout 选项对话框,输入远程项目目录和本地工作目录(这个得找建 立 SVNServer 的人要) 点击 OK,就会弹出一个远程服务器要求验证的对话框:输入用户名和密码之后,点击 OK 就开始下载:提交修改在你做了修改之后,你可以在项目文件夹下点击右键或者你修改的文件下点击右键,选择 SVN Commit…,这两者的区别在于,第一个可以一次提交你所做所有文件的修改,而第二 个只是提交你所选的文件。点击 Commit 之后,就会弹出一个让你输入更改 log 的对话框:输入你所作的修改,然后点击 OK,就会开始向远程服务器提交修改: 导入项目如果翻译插件或者写了插件,想提交到远程服务器,选择该文件夹,点击右键,选择 TortoiseSVN =& Import…然后就会弹出一个导入选项对话框, 属于远程服务器地址和注释, 如果你前面没有保存密码, 这里可能再次输入你在 Google Code 的密码。点击 OK,本地文件就会被导入远程服务器。注:如果 SVN 服务器上的文件夹未存在,则你可以遵照“导入操作”进行导入文件,上传 到 SVN 服务器。以后要修改 SVN 的文件时,你得首先创建新的文件夹,然后“下载项目” 到此空文件夹。 你只能将文件取出到一个空目录里。如果你想取出刚汇入的文件,Subversion 将报错。你只 能将文件取出到另一个目录或先删除已经存在的源文件再执行取出。 经验小结: 1.如果操作的文件之前还未提交,而你又想把文件提交到新的分支上,记得一定要选择 切换 2.SVN 分支的管理实际上就是把不同的分支用不同的文件保存, 因此你在取得新版本的 时候会发现,不同分支的最新文件也会被获取下来。创建 tag 操作,相当于把当前的代码版本复制一份到其他地方,然后以这个地方为出发 点进行新的开发,与原来位置的版本互不干扰。 对于 branches、tags、trunk 这三个目录,并不是 subversion 必需的,而是被总结的一种 良好的团队开发习惯,其使用方法为: 1.开发者提交所有的新特性到主干。 每日的修改提交到/trunk:新特性,bug 修正和其 他。 2.这个主干被拷贝 (注:拷贝的方法-单击D鼠标右键‖-&TortoiseSVN-&Branch/tags...-&To URL 中路径/branches/1.0) 到D发布‖分支。 当小组认为软件已经做好发布的准备(如,版本 1.0)然后/trunk 会被拷贝到/branches/1.0。 2.1 此时本地的 branches 文件夹中尚未有 trunk 的拷贝,必须与服务器同步下 3.项目组继续并行工作,一个小组开始对分支进行严酷的测试,同时另一个小组在/trunk 继续新的工作(如,准备 2.0) ,如果一个 bug 在任何一个位置被发现,错误修正需要来回运 送 (即:当 trunk 中的文件进行修改后,测试组人员在 branches 中可以通过:单击D鼠标右 键‖-&TortoiseSVN-&Switch-&To URL 中的地址一般会自动指向 trunk 文件夹,示意接下来将 同步 trunk 文件夹下修改过的文件到服务器及本地的 branches 文件夹) 。然而这个过程有时 候也会结束,例如分支已经为发布前的最终测试D停滞‖了。 4.分支已经作了标签并且发布,当测试结束,/branches/1.0 作为引用快照已经拷贝到 /tags/1.0.0,这个标签被打包发布给客户。 4.1 分支作标签发布到 tag 文件夹方法和 trunk 文件夹拷贝到 branches/1.0 做法相同 5.分支多次维护。当继续在/trunk 上为版本 2.0 工作,bug 修正继续从/trunk 运送到 /branches/1.0, 如果积累了足够的 bug 修正, 管理部门决定发布 1.0.1 版本: 拷贝/branches/1.0 到/tags/1.0.1,标签被打包发布。 一般建立最初的 repository 时,就建好这三个目录,把所有代码放入/trunk 中,如:要 将 project1 目录下的代码导入 repository, project1 的结构就是: project1/branches, project1/tags, project1/trunk,project1/trunk/food.c,project1/trunk/egg.pc……,然后将 project1 目录导入 repository,建立最初的资料库。然后 export 回 project1,作为本地工作目录。 6..多人单项目,三个文件夹的作用又不一样了: 单人维护一个主流版本.放于 trunk 目录里面; 多人开发通过单人或者是多人维护代表不同的模块.每个模块就是一个分支 brances; 在一定时期,各模块都有初步版本,则放于 trunk 中,然后由项目主管进行模块合并 成整体,给测试人员检测; 某个时期出现了一个稳定版本,就标记为一个发布版本,tags 来做标记. 分支/标记 版本控制系统的一个特性是能够把各种修改分离出来放在开发品的一个分割线上。 这条线被 称为分支。分支经常被用来试验新的特性,而不会对开发有编译错误的干扰。当新的特性足 够稳定之后,开发品的分支就可以混合回主分支里(主干线). 版本控制系统的另一个特性是能够标记特殊的版本(例如某个发布版本),所以你可以在任何 时候重新建立一个特定的构件和环境。这个过程被称作标记。 Subversion does not have special commands for branching or tagging, but uses so-called “cheap copies” instead. Cheap copies are similar to hard links in Unix, which means that instead of making a complete copy in the repository, an internal link is created, pointing to a specific tree/revision. As a result branches and tags are very quick to create, and take up almost no extra space in the repository.创建一个分支或标记如果你用推荐的目录结构导入了一个工程,那么创建分支或标记就非常简单: 图 5.33. 分支/标记对话框在 你当 前的工 作副本 中给 你你 想要复 制的分 支或 标记 选择一 个目录 ,然 后选 择命令 TortoiseSVN → 分支/标记...。 默认的目标 URL 将会是你当前工作副本所处的源 URL。 你必须给你的分支/标记编辑一个新 路径。来取代http://svn.collab.net/repos/ProjectName/trunk你可以使用这样的设置http://svn.collab.net/repos/ProjectName/tags/Release_1.10如果你忘记了你上一次使用的命名约定, 可以用鼠标右键打开版本库浏览器来察看已经存在 的版本库结构。 现在你必须选择要复制的源位置。在这里你有三个设置选项: 版本库中的最新版本 新分支直接从仓库中的最新版本里复制出来。不需要从你的工作副本中传输任何数 据,这个分支的建立是非常快的。 在版本库中指定具体的版本 在仓库中直接复制建立一个新分支同时你也可以选择一个旧版本。假如在你上周发布 了项目时忘记了做标记,这将非常有用。如果你记不起来版本号,通过点击鼠标右键 来显示版本日志,同时从这里选取版本号。和上次一样不需要从你的工作副本中传输 任何数据,这个分支建立起来是非常快的。 工作副本 新的分支是一个完全等同于你的本地工作副本的一个副本。如果你更新了一些文件到 你的工作副本的某个旧版本里,或者你在本地做出了修改,这些改变将准确无误的进 入副本中。自然而然地这种综合的标记会包含正在从工作副本传输到版本库的数据, 如果这些数据还不存在的话。 如果你想把你的工作副本自动切换到最新创建的分支, 使用转换工作副本至新分支/标记 选 择框.但是如果你打算这么做,首先要确认你的工作副本没有被修改。如果有修改的话,当 你转换后这些修改将会混合进你的工作副本分支里。 按下确认提交新副本到版本库中。 别忘了提供一条日志信息。 需要注意的是这个副本是在版 本库内部创建的。 linux 下 svn 命令大全.svnadmin create path 创建一个新的版本库, (path 为你想创建版本库的目录路径,如创建 版本库目录为 cellsms:svnadmin create/home/c7mon/svn/cellsms) 。2.svn mkdir URL 创建目录,向版本库新添加一个目录,(立即提交,所以需要日志信息):如 新增 trunk 目录:svn mkdir file:///home/c7mon/svn/cellsms/trunk -m &此目录的说明信息&。 svn mkdir newdir 在工作拷贝下新建一个目录,如新增 hello 目录,即在工作拷贝(svn checkout 数据的目录下):svn mkdir hello。3.svn import URL 向版本库导入数据,需要日志信息。如导入当前目录下 wwm 目录到版本 库 trunk 目录中:svn import file:///home/c7mon/svn/cellsms/trunk/wwm-m &日志说明信息&4.svn checkout URL 导出一个工作拷贝, 到你要存放导出数据的目录, cd 如导出 wwm 目录: svn checkout file:///home/c7mon/svn/cellsms/trunk/wwm , 或 svn checkoutsvn://192.168.3.33/home/c7mon/svn/cellsms/trunk/wwm。 svn://方式需要用户名和密 码,(svn co 为 svn checkout 简写) 。5.svn commit 提交工作拷贝的修改到版本库中,如对 wwm 下的文件进行修改后提交:svn commit -m &&,&&可以为空,最好加上日志说明。svn ci 为其简写。6.svn add file/dir 新添加的文件或目录,此处 dir 为 linux 命令 mkdir 在工作拷贝下创建的 目录,不是 svn mkdir 命令创建的目录,所以需要 svn add 预订添加。svn add 需要在工作 拷贝下执行, 如在 4 中 svn co 出的工作拷贝目录 wwm 下新添加了 hehe.c: add hehe.c。 svn 然 后执行 svncommit 提交到版本库。 7.svn copy URL URL 完全的服务器端拷贝,通常用在分支和标签。 如 wwm 项目完成后发 布版本 wwm_1.0: svn copy file:///home/c7mon/svn/cellsms/trunk/wwm file:///home/c7mon/svn/cellsms/trunk/tags/wwm_1.0 -m &it's the wwm_1.0 foranhui& 。 或 svncopy svn://192.168.3.33/home/c7mon/svn/cellsms/trunk/wwmsvn://192.168.3.33/home/c7mon/svn/c ellsms/trunk/tags/wwm_1.0 -m &it's thewwm_1.0 for anhui&。 tags 目录需提前在版本库中建 ( 好。 )如果 wwm_1.0 版本出现 BUG,可以拷贝 tags 目录下的 wwm_1.0 到建好的 branches 目录 下,然后 svn co 出 branches 下的 wwm_1.0 进行修改。这样 trunk 目录下的 wwm 可以继续 进行开发,而不会与 branches 下 1.0 版本的修改产生冲突。当 branches 下的 wwm_1.0 版 本修复 bug 后,可以使用 svn merge 命令,将修改的部分合并到 trunk 下的 wwm 工程中。8.svn list URL 显示 path 目录下的所有属于版本库的文件和目录(简写 svn ls) 如列出 cellsms 下目录信息:svn list svn://192.168.3.33/home/c7mon/svn/cellsms 9.svn info URL 显示本地或远程条目的信息。 如查看 cellsms 下信息:svn infosvn://192.168.3.33/home/c7mon/svn/cellsms 10.svn log URL 查看版本日志信息。 如查看 cellsms 下所有版本信息:svn log svn://192.168.3.33/home/c7mon/svn/cellsms11.svn mergeURL@version URL 合并,应用两组源文件的差别到工作拷贝路径。 假设情景:trunk/smpp trunk 为 smpp 项目开发的主目录,当开发完成时,smpp 被拷贝打 标签到 tags/smpp_1.0.0,这里 smpp_1.0.0 为发布版本。此时 trunk 下 smpp 继续进行 smpp 第二版本的开发,这时发现发布的 smpp_1.0.0 版本有 BUG 需要修改,于是拷贝 tags 下的 smpp_1.0.0 到分支目录 branches/smpp_1.0.0 进行修改。当改好 smpp_1.0.0 后,问题来了, 我们此刻需要把修改好后的 smpp_1.0.0 合并到此时正在 trunk 目录下正在开发 smpp 中。 解决: (1)一个 URL,为起始状态,其后的@version,表示取版本号,这个 version 就是 svn cp 到 branches 成功之后的那个版本。第二个 URL,为最终状态,既修改好的 smpp_1.0.0 的 URL。 其实就是左边和右边做了 一个 diff,应用到当前工作区目录,也就是 trunk 的工作 拷贝。 此时 $svn status 就可以看到变化了 (2)我们需要知道 smpp_1.0.0 被拷贝到 branches 目录时得版本号,命令为: svnlog -stop-on-copy svn://192.168.3.33/home/c7mon/svn/cellsms/branches/ (3)此命令需要在合并到 trunk 的工作拷贝中执行:(可以加上--dry-run 选项模拟 merge,但 不真正的去做) Svn merge svn://192.168.3.33/home/c7mon/svn/cellsms/branches/mscid_1.0.0@18svn://192.168.3.33/hom e/c7mon/svn/cellsms/branches/mscid_1.0.0(4)svn commit 提交。 (是在 trunk 的工作拷贝中)12.svn delete path/URL 从工作拷贝或版本库删除一个项目。 如想删除工作拷贝 smpp 下的 main.c 文件: svndelete main.c (需 cd 到 smpp 的工作拷贝的 目录下)。然后 svn commit 提交。 如想删除 trunk/smpp/main.c 文件:svn delete Cm Ddelete the main.c of smpp‖ Svn://192.168.3.33/home/c7mon/svn/cellsms/smpp/main.c(需要日志信息, 即-m D‖)。 然后 svn commit 提交。13.svn revert 取消所有的本地编辑。 如 12 中,你执行了 svn delete 后,想取消其 delete 操作,那么你在 svn commit 提交之前执 行本命令。例如:svn revert main.c。14. svn update 更新你的工作拷贝。 如你的工作拷贝为 trunk 下 smpp, 现在你想将修改的 smpp_1.0.0 的内容更新到你当前的 工作拷贝中,你可以:svn update Crversion(version 为 smpp_1.0.0 版本号)。如果你执行: svn update 命令,则默认更新最新的版本内容到当前工作拷贝中。15.svn status 打印工作拷贝文件和目录的状态。 如打印当前工作拷贝的状态:svnstatus Cu。16.svn lock 锁定工作拷贝中文件,避免其他用户修改导致冲突。 如:svn lock main.c(需要在工作拷贝中执行)。 如果有其他用户已锁定,你可以强制加锁,需要选项 --force。 17. svn unlock 解除锁定操作,如 svn unlock main.c。18.svn help 执行此命令可以查看 svn 所有的子命令。 svn 子命令 --help,查看子命令选项信息,如:svn lock - -help。1、将文件 checkout 到本地目录 svn checkout path(path 是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain 简写:svn co 2、往版本库中添加新的文件 svn add file 例如:svn add test.php(添加 test.php) svn add *.php(添加当前目录下所有的 php 文件) 3、将改动的文件提交到版本库 svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(如果选择了保持锁,就使用 Cno-unlock 开关) 例如:svn commit -m “add test file for my test“ test.php 简写:svn ci 4、加锁/解锁 svn lock -m “LockMessage“ [--force] PATH 例如:svn lock -m “lock test file“ test.php svn unlock PATH 5、更新到某个版本 svn update -r m path 例如: svn update 如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版 本。 svn update -r 200 test.php(将版本库中的文件 test.php 还原到版本 200) svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突, 需要先 update,修改文件,然后清除 svn resolved,最后再提交 commit) 简写:svn up 6、查看文件或者目录状态 1)svn status path(目录下的文件和子目录的状态,正常状态不显示) 【?:不在 svn 的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被 锁定】 2)svn status -v path(显示文件和子目录状态) 第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修 改人。 注:svn status、svn diff 和 svn revert 这三条命令在没有网络的情况下也可以执行的,原因 是 svn 在本地的.svn 中保留了本地版本的原始拷贝。 简写:svn st 7、删除文件 svn delete path -m “delete test fle“ 例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file” 或者直接 svn delete test.php 然后再 svn ci -m ?delete test file?,推荐使用这种 简写:svn (del, remove, rm) 8、查看日志 svn log path 例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化 9、查看文件详细信息 svn info path 例如:svn info test.php 10、比较差异 svn diff path(将修改的文件与基础版本比较) 例如:svn diff test.php svn diff -r m:n path(对版本 m 和版本 n 比较差异) 例如:svn diff -r 200:201 test.php 简写:svn di 11、将两个版本之间的差异合并到当前文件 svn merge -r m:n path 例如:svn merge -r 200:205 test.php(将版本 200 与 205 之间的差异合并到当前文件,但是 一般都会产生冲突,需要处理一下) 12、SVN 帮助 svn help svn help ci ―――――――――――――――――――――――――― 以上是常用命令,下面写几个不经常用的 ―――――――――――――――――――――――――― 13、版本库下的文件和目录列表 svn list path 显示 path 目录下的所有属于版本库的文件和目录 简写:svn ls 14、创建纳入版本控制下的新目录 svn mkdir: 创建纳入版本控制下的新目录。 用法: 1、mkdir PATH… 2、mkdir URL… 创建版本控制的目录。 1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增 调度,以待下一次的提交。 2、每个以 URL 指定的目录,都会透过立即提交于仓库中创建。 在这两个情况下,所有的中间目录都必须事先存在。 15、恢复本地修改 svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert: 用法: revert PATH… 注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复 被删除的目录 16、代码库 URL 变更 svn switch (sw): 更新工作副本至不同的 URL。 用法: 1、switch URL [PATH] 2、switch Crelocate FROM TO [PATH...] 1、更新你的工作副本,映射到一个新的 URL,其行为跟“svn update”很像,也会将 服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的 方法。 2、改写工作副本的 URL 元数据,以反映单纯的 URL 上的改变。当仓库的根 URL 变动 (比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用 这个命令更新工作副本与仓库的对应关系。 17、解决冲突 svn resolved: 移除工作副本的目录或文件的“冲突”状态。 用法: resolved PATH… 注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的 相关文件,然后让 PATH 可以再次提交。 18、输出指定文件或 URL 的内容。 svn cat 目标[@版本]…如果指定了版本,将从指定的版本开始查找。 svn cat -r PREV filename & filename (PREV 是上一版本,也可以写具体版本号,这样输出结 果是可以提交的)#Linux Data linux 下 svn 命令大全点评:1、 将文件 checkout 到本地目录 svn checkout path (path 是服务器上的目录) 例如: svn checkout svn://192.168.1.1/pro/domain 简写:svn co 2、往版本库中添加新的文件 svn add file 例如: add test.php(添加 test.php) svn add *.php(添加当前目录下所有的 php 文 svn 件1、将文件 checkout 到本地目录 svn checkout path(path 是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain 简写:svn co 2、往版本库中添加新的文件 svn add file 例如:svn add test.php(添加 test.php) svn add *.php(添加当前目录下所有的 php 文件) 3、将改动的文件提交到版本库 svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(如果选择了保持锁,就使用 Cno-unlock 开关) 例如:svn commit -m “add test file for my test“ test.php 简写:svn ci 4、加锁/解锁 svn lock -m “LockMessage“ [--force] PATH 例如:svn lock -m “lock test file“ test.php svn unlock PATH 5、更新到某个版本 svn update -r m path 例如: svn update 如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版 本。 svn update -r 200 test.php(将版本库中的文件 test.php 还原到版本 200) svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突, 需要先 update,修改文件,然后清除 svn resolved,最后再提交 commit) 简写:svn up 6、查看文件或者目录状态 1)svn status path(目录下的文件和子目录的状态,正常状态不显示) 【?:不在 svn 的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被 锁定】 2)svn status -v path(显示文件和子目录状态) 第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修 改人。 注:svn status、svn diff 和 svn revert 这三条命令在没有网络的情况下也可以执行的,原因 是 svn 在本地的.svn 中保留了本地版本的原始拷贝。 简写:svn st 7、删除文件 svn delete path -m “delete test fle“ 例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file” 或者直接 svn delete test.php 然后再 svn ci -m ?delete test file?,推荐使用这种 简写:svn (del, remove, rm) 8、查看日志 svn log path 例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化 9、查看文件详细信息 svn info path 例如:svn info test.php 10、比较差异 svn diff path(将修改的文件与基础版本比较) 例如:svn diff test.php svn diff -r m:n path(对版本 m 和版本 n 比较差异) 例如:svn diff -r 200:201 test.php 简写:svn di 11、将两个版本之间的差异合并到当前文件 svn merge -r m:n path 例如:svn merge -r 200:205 test.php(将版本 200 与 205 之间的差异合并到当前文件,但是 一般都会产生冲突,需要处理一下) 12、SVN 帮助 svn help svn help ci ―――――――――――――――――――――――――― 以上是常用命令,下面写几个不经常用的 ―――――――――――――――――――――――――― 13、版本库下的文件和目录列表 svn list path 显示 path 目录下的所有属于版本库的文件和目录 简写:svn ls 14、创建纳入版本控制下的新目录 svn mkdir: 创建纳入版本控制下的新目录。 用法: 1、mkdir PATH… 2、mkdir URL… 创建版本控制的目录。 1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增 调度,以待下一次的提交。 2、每个以 URL 指定的目录,都会透过立即提交于仓库中创建。 在这两个情况下,所有的中间目录都必须事先存在。 15、恢复本地修改 svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert: 用法: revert PATH… 注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复 被删除的目录 16、代码库 URL 变更 svn switch (sw): 更新工作副本至不同的 URL。 用法: 1、switch URL [PATH] 2、switch Crelocate FROM TO [PATH...] 1、更新你的工作副本,映射到一个新的 URL,其行为跟“svn update”很像,也会将 服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的 方法。 2、改写工作副本的 URL 元数据,以反映单纯的 URL 上的改变。当仓库的根 URL 变动 (比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用 这个命令更新工作副本与仓库的对应关系。 17、解决冲突 svn resolved: 移除工作副本的目录或文件的“冲突”状态。 用法: resolved PATH… 注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的 相关文件,然后让 PATH 可以再次提交。 18、输出指定文件或 URL 的内容。 svn cat 目标[@版本]…如果指定了版本,将从指定的版本开始查找。 svn cat -r PREV filename & filename (PREV 是上一版本,也可以写具体版本号,这样输出结 果是可以提交的)详细出处参考:http://www.jb51.net/os/RedHat/2461.htmlLinux 中 Subversion 配置实例一.安装yum install subversion二.配置 本系统采用为每个项目单独建一版本库的策略。配置文件,密码文件,访问控制文件 等都放在版本库的 conf 目录下。所以每次开始一个新项目都必须新建一个版本库,并重新配置各配置文件。还有很重 要的一条,要求各组员重新配置客户端,包括服务器版本库路径,本地路径等信息。1. 建立版本库目录(可建立多个,新建库后以下各项都需重新配置。注意区别安装目录 与版本库目录,以下讲的都是版本库目录)mkdir Cp /home/svn/repos#类似可以创建 mkdir Cp /home/svn/repos2 /home/svn/repos32. 建立 svn 版本库(与上面目录对应)svnadmin create /home/svn/repos执行此命令后 svn 自动在 repos 目录下添加必须的配置文件.注意:版本库不同于一般的文件夹, 直接在操作系统上新建文件无法被 SVN 识别, 必须 使用 import 等命令将文件导入版本库.此为 svn 内部指令,create 用于新建版本库。请使用 svn help 查看详细说明。 3. 修改版本库配置文件vi /home/svn/repos/conf/svnserve.conf各参数功能在配置文件的注释中有说明, 此处配置如下:[general]anon-access = none # 使非授权用户无法访问auth-access = write # 使授权用户有写权限password-db = passwd # 指明密码文件路径authz-db = authz # 访问控制文件realm = /home/svn/repos # 认证命名空间,subversion 会在认证提示里显示,并且作为 凭证缓存的关键字。其它采用默认配置. 各语句都必须顶格写, 左侧不能留空格, 否则会出错.4. 配置用户 vi /home/svn/repos/conf/passwd输入以下内容:[users]username1 = password1username2 = password2可以添加多个,此为用户名密码对。5. 配置权限vi /home/svn/repos/conf/authz此配置文件设置各用户的授权。包括只读 r,读写 rw。没有列出的用户,则不允许访问。还可以对用户分组,具体请 参考 svn 手册,以下是简单例子:#对仓库 repos 根目录权限设置[repos:/] user1 = rwuser2 = r6. 使用 import 导入文件新建好的版本库是空的,需要导入工作目录。//这条语句将把路径/home/user/code 下找到的文件导入到你创建的 Subversion 仓库中 去svn import /home/code/ file:///home/svn/repos/ -m “注释”三.启动服务svnserve -d -r /home/svn/svn checkout svn://ip/repos输入用户名密码即可本篇文章来源于 Linux 公社网站() 原文链接: /Linux/09.htm TortoiseSVN 简明使用先介绍下什么是 SubVersion,Subversion 是新一代的版本控制工具,不仅可以管理程序源代 码,也可以应用于其他协作管理数据的工作。安装你 可 以 从 TortoiseSVN 官 方 站 点 下 载 最 新 版 的 TortoiseSVN , 中 文 汉 化 包 可 以 从 SubVersion 中文站下载。下载之后,点击安装包,一路 next 下去即可。下载项目在你硬盘的适当的位置,点击邮件,选择 SVN Checkout…然后就会弹出一个 Checkout 选项对话框,输入远程项目目录和本地工作目录(这个得找建立 SVNServer 的人要) 点击 OK,就会弹出一个远程服务器要求验证的对话框: 输入用户名和密码之后,点击 OK 就开始下载:提交修改在你做了修改之后,你可以在项目文件夹下点击右键或者你修改的文件下点击右键,选择 SVN Commit…,这两者的区别在于,第一个可以一次提交你所做所有文件的修改,而第二 个只是提交你所选的文件。点击 Commit 之后,就会弹出一个让你输入更改 log 的对话框:输入你所作的修改,然后点击 OK,就会开始向远程服务器提交修改:导入项目如果翻译插件或者写了插件,想提交到远程服务器,选择该文件夹,点击右键,选择 TortoiseSVN =& Import…然后就会弹出一个导入选项对话框, 属于远程服务器地址和注释, 如果你前面没有保存密码, 这里可能再次输入你在 Google Code 的密码。点击 OK,本地文件就会被导入远程服务器。注:如果 SVN 服务器上的文件夹未存在,则你可以遵照“导入操作”进行导入文件,上传 到 SVN 服务器。以后要修改 SVN 的文件时,你得首先创建新的文件夹,然后“下载项目” 到此空文件夹。 你只能将文件取出到一个空目录里。如果你想取出刚汇入的文件,Subversion 将报错。你只 能将文件取出到另一个目录或先删除已经存在的源文件再执行取出。 经验小结: 1.如果操作的文件之前还未提交,而你又想把文件提交到新的分支上,记得一定要选择 切换 2.SVN 分支的管理实际上就是把不同的分支用不同的文件保存, 因此你在取得新版本的 时候会发现,不同分支的最新文件也会被获取下来。创建 tag 操作,相当于把当前的代码版本复制一份到其他地方,然后以这个地方为出发 点进行新的开发,与原来位置的版本互不干扰。 对于 branches、tags、trunk 这三个目录,并不是 subversion 必需的,而是被总结的一种 良好的团队开发习惯,其使用方法为: 1.开发者提交所有的新特性到主干。 每日的修改提交到/trunk:新特性,bug 修正和其 他。 2.这个主干被拷贝 (注:拷贝的方法-单击D鼠标右键‖-&TortoiseSVN-&Branch/tags...-&To URL 中路径/branches/1.0) 到D发布‖分支。 当小组认为软件已经做好发布的准备(如,版本 1.0)然后/trunk 会被拷贝到/branches/1.0。 2.1 此时本地的 branches 文件夹中尚未有 trunk 的拷贝,必须与服务器同步下 3.项目组继续并行工作,一个小组开始对分支进行严酷的测试,同时另一个小组在/trunk 继续新的工作(如,准备 2.0) ,如果一个 bug 在任何一个位置被发现,错误修正需要来回运 送 (即:当 trunk 中的文件进行修改后,测试组人员在 branches 中可以通过:单击D鼠标右 键‖-&TortoiseSVN-&Switch-&To URL 中的地址一般会自动指向 trunk 文件夹,示意接下来将 同步 trunk 文件夹下修改过的文件到服务器及本地的 branches 文件夹) 。然而这个过程有时 候也会结束,例如分支已经为发布前的最终测试D停滞‖了。 4.分支已经作了标签并且发布,当测试结束,/branches/1.0 作为引用快照已经拷贝到 /tags/1.0.0,这个标签被打包发布给客户。 4.1 分支作标签发布到 tag 文件夹方法和 trunk 文件夹拷贝到 branches/1.0 做法相同 5.分支多次维护。当继续在/trunk 上为版本 2.0 工作,bug 修正继续从/trunk 运送到 /branches/1.0, 如果积累了足够的 bug 修正, 管理部门决定发布 1.0.1 版本: 拷贝/branches/1.0 到/tags/1.0.1,标签被打包发布。 一般建立最初的 repository 时,就建好这三个目录,把所有代码放入/trunk 中,如:要 将 project1 目录下的代码导入 repository, project1 的结构就是: project1/branches, project1/tags, project1/trunk,project1/trunk/food.c,project1/trunk/egg.pc……,然后将 project1 目录导入 repository,建立最初的资料库。然后 export 回 project1,作为本地工作目录。 6..多人单项目,三个文件夹的作用又不一样了: 单人维护一个主流版本.放于 trunk 目录里面; 多人开发通过单人或者是多人维护代表不同的模块.每个模块就是一个分支 brances; 在一定时期,各模块都有初步版本,则放于 trunk 中,然后由项目主管进行模块合并 成整体,给测试人员检测; 某个时期出现了一个稳定版本,就标记为一个发布版本,tags 来做标记. 分支/标记 版本控制系统的一个特性是能够把各种修改分离出来放在开发品的一个分割线上。 这条线被 称为分支。分支经常被用来试验新的特性,而不会对开发有编译错误的干扰。当新的特性足 够稳定之后,开发品的分支就可以混合回主分支里(主干线). 版本控制系统的另一个特性是能够标记特殊的版本(例如某个发布版本),所以你可以在任何 时候重新建立一个特定的构件和环境。这个过程被称作标记。 Subversion does not have special commands for branching or tagging, but uses so-called “cheap copies” instead. Cheap copies are similar to hard links in Unix, which means that instead of making a complete copy in the repository, an internal link is created, pointing to a specific tree/revision. As a result branches and tags are very quick to create, and take up almost no extra space in the repository.创建一个分支或标记如果你用推荐的目录结构导入了一个工程,那么创建分支或标记就非常简单: 图 5.33. 分支/标记对话框在 你当 前的工 作副本 中给 你你 想要复 制的分 支或 标记 选择一 个目录 ,然 后选 择命令 TortoiseSVN → 分支/标记...。 默认的目标 URL 将会是你当前工作副本所处的源 URL。 你必须给你的分支/标记编辑一个新 路径。来取代http://svn.collab.net/repos/ProjectName/trunk你可以使用这样的设置http://svn.collab.net/repos/ProjectName/tags/Release_1.10如果你忘记了你上一次使用的命名约定, 可以用鼠标右键打开版本库浏览器来察看已经存在 的版本库结构。 现在你必须选择要复制的源位置。在这里你有三个设置选项: 版本库中的最新版本 新分支直接从仓库中的最新版本里复制出来。不需要从你的工作副本中传输任何数 据,这个分支的建立是非常快的。 在版本库中指定具体的版本 在仓库中直接复制建立一个新分支同时你也可以选择一个旧版本。假如在你上周发布 了项目时忘记了做标记,这将非常有用。如果你记不起来版本号,通过点击鼠标右键 来显示版本日志,同时从这里选取版本号。和上次一样不需要从你的工作副本中传输 任何数据,这个分支建立起来是非常快的。 工作副本 新的分支是一个完全等同于你的本地工作副本的一个副本。如果你更新了一些文件到 你的工作副本的某个旧版本里,或者你在本地做出了修改,这些改变将准确无误的进 入副本中。自然而然地这种综合的标记会包含正在从工作副本传输到版本库的数据, 如果这些数据还不存在的话。 如果你想把你的工作副本自动切换到最新创建的分支, 使用转换工作副本至新分支/标记 选 择框.但是如果你打算这么做,首先要确认你的工作副本没有被修改。如果有修改的话,当 你转换后这些修改将会混合进你的工作副本分支里。 按下确认提交新副本到版本库中。别忘了提供一条日志信息。需要注意的是这个副本是在 版本库内部创建的。SVN + CruiseControl.NET + NANT 自动 编译提交的项目最小 DEMO
svnant 使用笔记 1 简介 svnant 是 ant 的一个插件,最新版本为 svnant-1.3.1。在 ant 配置文件中插 入以下代码,完成 svnant 插件的引用 &path id=&svn...Jenkins+Maven+svn+Tomcat入门文档_其它_高等教育_教育...项目了 在环境变量里配置 maven 的安装目录 Windows...(如果使用 Ant 则还包括其他属性文件,maven.xm l ...apache整合tomcat以及svn_IT/计算机_专业资料。linux下apache整合tomcat apache 整合 tomcat 以及 svn #---tomcat 整合---#---1.workers.properties...主要讲解了在eclipse中如何用svn检出和程序发布到tomcat的全过程,最后还讲解了...svn 检出项目”单击【next】 3) 以前检出过项目,配置了 svn 地址,直接选择...AutoBuild配置文档_计算机软件及应用_IT/计算机_专业资料。Ant 命令,自动编译部署web程序,Tomcat7Ant+svn 自动编译部署 1. 环境搭建 1.1 工具下载: 1.1.1 下载...是一款代码版本管理软件 svn 配置就是可以将共享 的项目下载下来使用本地服务器 tomcat 启动工程,在本地用 http://localhost:8080/文件名 即可浏览 web 和测试。...(不打算通过 apache-tomcat-7.0.20\conf\Catalina\localhost 下的 xml 指定 编译后的项目存放路径,即 WebRoot) 。以下操作可解决上述问题: 1 SVN 检出项目查看...jenkins自动构建工具使用手册(svn+ant+jboss)_计算机...放倒 tomcat 的 webapp 文件 夹中,启动 tomcat ...ANT 构建配置项目用 ant 脚本实现的编译和打包, ...环境部署_计算机软件及应用_IT/计算机_专业资料。liunx相关环境部署、ant、tomcat、mysql、nginx、svn、jdk一、linux 下 mysql 的安装过程 安装步骤如下: 1、下载 ...CentOS系统安装SunJDK SVN ANT MAVEN TOMCAT CentO SunJDK SubVersion Ant Maven...建议使用配置档修改操作。 ? ? ? ? /etc/sysconfig/network Centos 设置主机...
All rights reserved Powered by
copyright &copyright 。文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 svn tomcat 集成 的文章

 

随机推荐