命令行输入: sudo apt-get install subversion
一、 基本概念
版本库:服务器上的文件目录
工作拷贝:svn co分支到你本地的文件夹目录
工作副本:co到本地的目录下的每个文件夹里的.svn文件夹。记录了
"帮助 Subversion 识别哪些文件做过修改,哪些文件相对于别人的工作已经过期"
的信息。
|
二、SVN版本比对原理
通过.svn与版本库比对。
".svn"
文件夹下记录
2
个信息:
1
、是当前用户co下分支的版本号,
2
、是记录用户本地修改的最后时间戳。
通过以上
2
个信息,版本库能识别不同的状态,从而给予或限制用户做什么类型的操作。
当出现版本库中该分支已经有人提交代码(即版本库中该分支的版本更新),并且本地自己有修改,此时,如果用户提交,版本库先比较用户本地工作拷贝.svn中的版本和版本库版本,同时比较时间。她将需要用户先svn up,然后看看是否有冲突,没冲突再svn ci。
|
三、svn常用命令
以rate应用为例,实际说明操作。
1
、svn cp
svn cp http:
//svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100810_7368_2 http://svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV -m"xfc cp"
【注】:该动作已经由aone接手操作。
2
、svn co(svn checkout)
svn co http:
//svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV rate (【注】:自定义目录,本地目录)
3
、svn st
! biz/remark/src/java/com/alibaba/china/rate/biz/remark/service/impl/RemarkServiceImpl.java
D biz/remark/src/java/com/alibaba/china/rate/biz/remark/service/impl/RemarkTempServiceImpl.java
? biz/remark/src/java/com/alibaba/china/rate/biz/remark/util/MyTestUtil.java
A biz/remark/src/java/com/alibaba/china/rate/biz/remark/util/MyTestUtil2.java
X deploy/jboss_server
M web/remark/src/java/com/alibaba/china/rate/remark/web/action/ListsAction.java
? bundle/war/src/webroot/META-INF/autoconf/log4j.xml.r250274
? bundle/war/src/webroot/META-INF/autoconf/log4j.xml.mine
? bundle/war/src/webroot/META-INF/autoconf/log4j.xml.r250702
C bundle/war/src/webroot/META-INF/autoconf/log4j.xml
【注】:
"!"
表示:本地执行了
"rm -rf"
,但是未执行
"svn del"
的状态。
"?"
表示:本地新加了一个文件,但是未执行
"svn add"
的状态。
"A"
表示:本地新加了一个文件,且执行了
"svn add"
的状态。
"X"
表示:执行了
"svn external"
的状态。
"D"
表示:本地执行了
"rm -rf"
,且执行了
"svn del"
的状态。
"M"
表示:本地修改了该文件时的状态。
"C"
表示:冲突状态,是重点关注状态之一。
产生的场景:A\B两个开发修改同一处代码,其中A开发已经提交,B开发在svn up的时候,就会出现conflict的提示,需要用解决冲突后,svn resolved下,具体见svn resolved。
4
、svn up
【注】:当出现多个开发在同一个项目中开发同一个应用分支时,提交代码前都需要先做一次
"svn up"
,保证合并最新代码,同时解决本地冲突。
5
、svn info
【注】:一般用于获取当前分支url。
6
、svn diff
M web/remark/src/java/com/alibaba/china/rate/remark/web/action/ListsAction.java
【注】:以上这个
""
状态的文件,想看它相对你最新一次co的版本修改了那些,可以使用:
svn diff web/remark/src/java/com/alibaba/china/rate/remark/web/action/ListsAction.java
"-"
是本地删除的行。
"+"
是本地增加的行。
7
、svn revert
【注】:当你发现某个你修改的文件你不想修改了,怎么办:svn revert。
svn revert web/remark/src/java/com/alibaba/china/rate/remark/web/action/ListsAction.java
然后svn st下,你会发现改文件M状态已经没了。
8
、svn resovled
【注】:如上面
3
(svn st),当出现
"svn up"
下来的文件和本地的有冲突(即出现C状态)的时候,冲入如何解决呢?
a,打开文件:vi bundle/war/src/webroot/META-INF/autoconf/log4j.xml
b,你会发现有这么
3
个标识:
<<<<<<< .mine
=======
>>>>>>> .r250702
另外还有
3
个文件:
? bundle/war/src/webroot/META-INF/autoconf/log4j.xml.r250274
? bundle/war/src/webroot/META-INF/autoconf/log4j.xml.mine
? bundle/war/src/webroot/META-INF/autoconf/log4j.xml.r250702
以上意思是:
"<<<<<<< .mine"
和
"======="
之间的是你本地添加到内容。
"======="
和
">>>>>>> .r250702"
部分的就是svn up下来的内容。
c,捞出修改这部分代码的开发,跟他一起确认如何解决冲突。
d,当确认了解决方案,解决了冲突,就删除类似以上那
3
个标识。
最后:svn resovled bundle/war/src/webroot/META-INF/autoconf/log4j.xml
冲突解决。你会发现上面的
3
个文件不翼而飞了。
9
、svn ci
【注】:提交本地修改代码到服务器。
svn ci -m
"modify remark log4j conf."
10
、svn log
【注】:显示提交的日志信息
默认,显示该分支的所有相关版本提交日志。
如果只想显示自己打的分支,提交的日志情况,可以使用
"—stop-on-copy"
即可(stop前是
2
个
"-"
)。
11
、svn merge
【注】:合并分支。需要将老的修改合并到最新打出来的分支。
【注】:恢复旧版本。
当新打一条分支:
svn cp http:
//svn.alibaba-inc.com/repos/ali_cn/olps/rate/trunk http://svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV2 -m"xfc cp"
现在要将老分支(http:
//svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV)的修改合并到新分支(http://svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV2)上,步骤如下:
(
1
)co下新分支。
svn co http:
//svn.alibaba-inc.com/repos/ali_cn/olps/rate/trunk http://svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV2 ratenew
(
2
)查看老分支提交日志。
svn log --stop-on-copy http:
//svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV
------------------------------------------------------------------------
r250702 | fangcheng.xiaofc |
2010
-
08
-
17
20
:
38
:
19
+
0800
(二,
17
8
月
2010
) |
1
line
xfc ci
------------------------------------------------------------------------
r250272 | fangcheng.xiaofc |
2010
-
08
-
17
10
:
14
:
33
+
0800
(二,
17
8
月
2010
) |
1
line
xfc cp
以上
"r250272"
版本是本分支最老的版本号,最新版本可用
"HEAD"
表示。
(
3
)合并老分支对应版本到新分支。
xfc
@xfc
:~/ratenew/20100817_xfc_DEV2$ svn merge --dry-run -r250272:HEAD http:
//svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV
--- Merging r250273 through r250724 into
'.'
:
U bundle/war/src/webroot/META-INF/autoconf/log4j.xml
"--dry-run"
是假合并,并没有真正合并分支修改到新分支,如果要真做,删除该参数。
恢复旧版本,只要把版本次序倒过来:
svn merge HEAD :-r250272 http:
//svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV
svn merge的原理是比对版本差异,然后把差异的内容应用、合并到本地工作拷贝中。高版本:低版本,相当于
"相对于高版本,低版本删除或者修改了那些内容"
。
|
四、乌龟的使用
乌龟通常方便用于svn ignore和svn external这2个属性的设置上。
右键点击"deploy"的"show properties"可以查看到:
点击"new","edit"可以新增,修改svn属性。
以下是详细讲解,建议大家先查看如下命令,先自我理解一下,然后再看如下的详解.
svn预览合并功能
svn log --stop-on-copy http://svn.alibaba-inc.com/repos/ali_cn/olps/vaspool_shared/branches/20110725_69011_vaspoolshared_3
svn co http://svn.alibaba-inc.com/repos/ali_cn/olps/vaspool_shared/branches/20110728_69011_vaspoolshared_4 vaspool_shared_temp
cd vaspool_shared_temp
svn merge (--dry-run) -r381850:HEAD http://svn.alibaba-inc.com/repos/ali_cn/olps/vaspool_shared/branches/20110725_69011_vaspoolshared_3
svn ci