http://www.cnblogs.com/ylqmf/archive/2011/09/13/2174429.html
http://blog.csdn.net/vincent17113/article/details/6265423:未整理参考文章
SVN(Subversion)是一个自由、开源的项目源代码版本控制工具。目前,绝大多数开源软件和企业代码管理,都使用SVN作为代码版本管理软件。SVN将文件存放在中心版本库里,这个版本库很像一个普通的文件服务器。不同的是,它可以记录每一次文件和目录的修改情况,这样就可以在需要的回滚时,将数据恢复到以前的版本,并可以查看数据的更改细节。
因为你的工作拷贝“同你系统上的文件和目录没有任何区别”,你可以随意修改文件,但是你必须告诉Subversion你做的其他任何事。例如,你希望拷贝或移动工作拷贝的一个文件,你应该使用svn copy或者 svn move而不要使用操作系统的拷贝移动命令。
svn checkout path
简写:svn co path
说明:path是服务器上的目录
例如:svn co svn://192.168.1.1/pro/domain
svn add file
说明:不能直接使用 svn add * 命令,必须使用 “svn add * --force” 命令。--force参数只不过是驱使 svn 去检查一个子目录,而不管这个子目录是否已经纳入管理。
例如:svn add *.php(添加当前目录下所有的php文件)
svn commit -m “LogMessage” [-N] [--no-unlock] PATH(如果选择了保持锁,就使用–no-unlock开关)
简写:svn ci -m ‘’
例如:svn ci -m “add test file for my test“ test.phpsvn unlock PATH
例如:svn lock -m “lock test file“ test.php
svn update -r m path
简写:svn up
说明:svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。
例如:svn up -r 200 test.php(将版本库中的文件test.php还原到版本200)
Select: (p) postpone, (df) diff-full, (e) edit, (mc) mine-conflict, (tc) theirs-conflict, (s) show all options: svn detects that theres a conflict here and require you to take some kind of action. (e) edit - change merged file in an editor #直接进入编辑 (df) diff-full - show all changes made to merged file #显示更改至目标文件的所有变化 (r) resolved - accept merged version of file (dc) display-conflict - show all conflicts (ignoring merged version) #显示所有冲突 (mc) mine-conflict - accept my version for all conflicts (same) #冲突以本地为准 (tc) theirs-conflict - accept their version for all conflicts (same) #冲突以服务器为准 (mf) mine-full - accept my version of entire file (even non-conflicts)#完全以本地为准 (tf) theirs-full - accept their version of entire file (same) #完全以服务器为准 (p) postpone - mark the conflict to be resolved later #标记冲突,稍后解决 (l) launch - launch external tool to resolve conflict (s) show all - show this list
举例如下:
1,创建test.txt
test2,上传该文件,版本为revision3
C:\workspace\test>svn ci -m "making a starting point" Sending . Sending test.txt Transmitting file data . Committed revision 2.3,假设我们有User1和User2. 二者均从repository中update下载该文件,版本为revision2
C:\workspace\test>svn up A test.txt At revision 2.4,User1修改文件test.txt
User1 is making a conflict test5,User1上传文件test.txt 版本为revision3
C:\workspace\test>svn ci -m "User1 starting a conflict" Sending . Sending test.txt Transmitting file data . Committed revision 3.6,User2修改文件test.txt
test User2 making a conflict7,User2上传文件test.txt,版本为revision4,遇到错误
svn: Commit failed (details follow): svn: File or directory 'test.txt' is out of date; try updating svn: resource out of date; try updating8,User2开始更新文件
C:\workspace\test>svn up Conflict discovered in 'test.txt'. Select: (p) postpone, (df) diff-full, (e) edit, (mc) mine-conflict, (tc) theirs-conflict, (s) show all options: svn detects that theres a conflict here and require you to take some kind of action.9,User2选择‘df’,展开冲突的内容
Select: (p) postpone, (df) diff-full, (e) edit, (mc) mine-conflict, (tc) theirs-conflict, (s) show all options: df --- .svn/text-base/test.txt.svn-base Tue Aug 10 10:59:38 2010 +++ .svn/tmp/test.txt.2.tmp Tue Aug 10 11:33:24 2010 @@ -1 +1,3 @@ -test \ No newline at end of file +<<<<<<< .mine +test User2 making conflict======= +User1 is making a conflict test>>>>>>> .r310,User2选择‘e’,可编辑冲突的内容
<<<<<<< .mine test User2 making conflict======= User1 is making a conflict test>>>>>>> .r311,User2按如下方式编辑了冲突并保存:
User1 is making a conflict test User2 making conflict12,User2重新选择‘r’,表示resolved并被标记为G(表示该文件冲突已被解决)
Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved, (mc) mine-conflict, (tc) theirs-conflict, (s) show all options: e Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved, (mc) mine-conflict, (tc) theirs-conflict, (s) show all options: r G test.txt Updated to revision 3.13,User2检查该文件状态
C:\workspace\test2>svn st M test.txt14,User2提交该文件,版本为revision4
C:\workspace\test2>svn ci -m "conflict resolved" Sending test.txt Transmitting file data . Committed revision 4.15,User2刚才也可以选择‘p’来延迟解决冲突
Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved, (mc) mine-conflict, (tc) theirs-conflict, (s) show all options: p C test.txt Updated to revision 3. Summary of conflicts: Text conflicts: 116,这时会发现svn帮助建立了如下三个文件
08/10/2010 11:44 AM 94 test.txt 08/10/2010 11:44 AM 26 test.txt.mine 08/10/2010 11:44 AM 27 test.txt.r2 08/10/2010 11:44 AM 31 test.txt.r3 test.txt为包含User1与User2冲突的文件 <<<<<<< .mine test User2 making conflict======= User1 am making a conflict test>>>>>>> .r3test.txt.mine是User2的本地文件
test User2 making conflicttest.txt.r2为原始reversion2的拷贝
testtest.txt.r3为User1提交的reversion3的拷贝
User1 is making a conflict test17,此时User2修改了test.txt的冲突并提交
C:\workspace\test>svn resolve --accept working test.txt Resolved conflicted state of 'test.txt' C:\workspace\test>svn ci -m "conflict resolved" Sending test.txt Transmitting file data . Committed revision 4.
1)svn status path(目录下的文件和子目录的状态,正常状态不显示)
说明:【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】
2)svn status -v path(显示文件和子目录状态)
说明:【第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。】
简写:svn st
注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
svn status可能返回的状态码
A
文件、目录或是符号链item预定加入到版本库。
C
文件item发生冲突,在从服务器更新时与本地版本发生交迭,在你提交到版本库前,必须手工的解决冲突。
D
文件、目录或是符号链item预定从版本库中删除。
M
文件item的内容被修改了。
R
文件、目录或是符号链item预定将要替换版本库中的item,这意味着这个对象首先要被删除,另外一个同名的对象将要被添加,所有的操作发生在一个修订版本。
X
目录没有版本化,但是与Subversion的外部定义关联,关于外部定义,可以看“外部定义”一节。
?
文件、目录或是符号链item不在版本控制之下,你可以通过使用svn status的--quiet(-q)参数或父目录的svn:ignore属性忽略这个问题。
!
文件、目录或是符号链item在版本控制之下,但是已经丢失或者不完整,这可能因为使用非Subversion命令删除造成的,如果是一个目录,有可能是检出或是更新时的中断造成的,使用svn update可以重新从版本库获得文件或者目录,也可以使用svn revert file恢复原来的文件。
~
文件、目录或是符号链item在版本库已经存在,但你的工作拷贝中的是另一个。举一个例子,你删除了一个版本库的文件,新建了一个在原来的位置,而且整个过程中没有使用svn delete或是svn add。
I
文件、目录或是符号链item不在版本控制下,Subversion已经配置好了会在svn add、svn import和svn status命令忽略这个文件。注意,这个符号只会在使用svn status的参数--no-ignore时才会出现—否则这个文件会被忽略且不会显示!
svn delete path -m “delete test fle”
简写:svn (del, remove, rm)
例如:先,svn delete test.php 再,svn ci -m ‘delete test file‘
svn log path
例如:svn log -l 3 test.php 显示这个文件的最近三条修改记录,及其版本号的变化
例如:svn log file -r 204424显示 r204424这个版本的提交信息
例如:svn log file -r 204424 -v 详细显示 r204424这个版本的提交记录
svn info path
例如: svn info test.php1)svn diff path(将修改的文件与基础版本比较)
例如:svn diff test.php
2)svn diff -r m:n path(对版本m和版本n比较差异)
例如:svn diff -r 200:201 test.php
例如:svn diff -c r208425 查看这个版本的差别
简写:svn di
root@letuknowit:/home/kris/calc/trunk# svn diff main.c Index: main.c =================================================================== --- main.c (revision 8) +++ main.c (working copy) @@ -7,7 +7,8 @@ printf("5 + 10 = %d.\n",add(5,10)); printf("15 - 10 = %d.\n",sub(15,10)); //kris's test - printf("kris: 12 + 28 = %d.\n",add(12,28)); + printf("kris: 32 + 28 = %d.\n",add(32,28)); + printf("kris: 15 - 10 = %d.\n",sub(15,10)); //sally's test printf("sally: 60 - 33 = %d.\n",sub(60,33)); return 0;svn diff可以查看当前工作拷贝中所有的被修改的文件,对于每个文件的diff输出部分由Index: 文件名的形式进行区分。等于号后面的内容就是关于main.c文件的diff情况了。
--- main.c (revision 8) +++ main.c (working copy)--- 打头的是原始文件,也就是版本库中的最新版本,或者理解为修改前的文件
@@ -7,7 +7,8 @@这里的-和+分别表示原始文件和目标文件,7,7表示从第7行开始的7行,-7,7就是原始文件的从第7行开始的7行内容,+7,8的意思类似,表示目标文件从第7行开始的8行内容。
结合起来理解就是:目标文件从第7行开始的8行内容和原始文件的从第7行开始的7行内容之间存在差异
printf("5 + 10 = %d.\n",add(5,10)); printf("15 - 10 = %d.\n",sub(15,10)); //kris's test - printf("kris: 12 + 28 = %d.\n",add(12,28)); + printf("kris: 32 + 28 = %d.\n",add(32,28)); + printf("kris: 15 - 10 = %d.\n",sub(15,10)); //sally's test printf("sally: 60 - 33 = %d.\n",sub(60,33)); return 0;这个就是具体的差异情况了,前面的-号表示需要从原始文件中删除的行,+号表示目标文件中将要增加的行,-号开头的部分只属于原始文件,+号开头的部分只属于目标文件,其余的是两者相同的部分。
7 1 1 printf("5 + 10 = %d.\n",add(5,10)); 8 2 2 printf("15 - 10 = %d.\n",sub(15,10)); 9 3 3 //kris's test 10 4 - printf("kris: 12 + 28 = %d.\n",add(12,28)); 11 4 + printf("kris: 32 + 28 = %d.\n",add(32,28)); 12 5 + printf("kris: 15 - 10 = %d.\n",sub(15,10)); 13 5 6 //sally's test 14 6 7 printf("sally: 60 - 33 = %d.\n",sub(60,33)); 15 7 8 return 0;为了进一步了解@@ -7,7 +7,8 @@的意思,上面加上了行号等信息,第一列的数字是行号,后面两列的数字表示第几行。经过标注可以清晰的看出原始文件第7行开始的7行和目标文件第7行开始的8行内容了。
svn merge -r m:n path
例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)svn help ci
说明:创建纳入版本控制下的新目录。
说明: 主要用来恢复文件的SVN状态,比如一个SVN下文件是A(add),D(delete),M(modify)状态,那么用svn revert可以恢复该文件到原来的“SVN状态”。
说明:移除工作副本的目录或文件的“冲突”状态。
注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的相关文件,然后让 PATH 可以再次提交。
$ svnadmin create /usr/local/svn/newrepos $ svn import mytree file:///usr/local/svn/newrepos/some/project Adding mytree/foo.c Adding mytree/bar.c Adding mytree/subdir Adding mytree/subdir/quux.h Committed revision 1.上面的例子把在some/project目录下mytree目录的内容复制到资料库中。
$ svn list file:///usr/local/svn/newrepos/some/project bar.c foo.c subdir/
注意在导入完成后,原来的树没有被转化成一个工作副本。为了开始工作,你仍然需要svn checkout这个树的一个新的工作副本。
在某个分支上,都是自己的代码,需要最终合线,可以只将之前的diff找出来打包
svn diff --summarize -r37565:37571 | awk '{print $2}' | xargs tar czvf backup_$(date +%F).tar.gz
tar -czvf test_diff.tar.gz `svn di --summarize -r41413:41408| awk '{print $2}' `
注意,在查找原来版本和最新版本时,svn log 默认是当前目录的log记录。不一定是整个代码树的最新log。所以建议使用URL来查找。
svn log https://develop/genericbranch_7 | less
svn cp -m "create new branch" http://online -r 38577 http://branch_7
命令 | 功能 | 使用格式 |
checkout | 检出 | svn co URL |
up | 更新到当前URL的末端 | svn up |
switch | 更新到某一tag/branch | svn switch (tag/分支)URL |
add | 增加 | svn add 文件名/目录名 |
rm | 删除文件 | svn rm 文件名 |
删除目录 | svn rm 目录名 | |
diff | 与base版本(最后检出或者更新到的版本)对比 | svn diff |
与版本库中最新版本对比 | svn diff -r head | |
当前工作副本,两个版本之间对比 | svn diff -r reversion1:reversion2 | |
版本库中任意两个tag做对比 | svn diff (tag1)URL (tag2)URL | |
ci | 提交 | svn ci -m "commit log" |
log | 查看当前工作副本log | svn log |
只查看指定版本的log | svn log -r | |
打印log所有附加信息 | svn log -v | |
查看当前tag/branch版本详情 | svn log --stop-on-copy -v | |
info | 查看当前工作副本所在URL | svn info |
status | 查看工作副本的状态 | svn st |
查看文件的taglist | svn命令不支持,可执行cs taglist | |
tag | 新增tag | svn cp . (tag)URL |
删除tag | svn rm (tag)URL -m "commit log" | |
覆盖已经存在的tag | 不支持 | |
分支开发 | 创建branch | svn cp (基线版本)URL (分支)URL -m "commit log" |
删除branch | svn rm (分支)URL -m "commit log" | |
同步 | svn co (主干)URL | |
cd ~/wc | ||
svn merge (主干)URL (待同步tag)URL | ||
svn ci -m "commit log" | ||
svn cp (主干)URL (以_PD_BL_MAIN结尾的tag)URL -m"commit log" | ||
合并 | svn co (合并目标)URL | |
cd ~/wc | ||
svn merge (基线版本tag)URL (上线tag)URL | ||
svn ci -m "commit log" | ||
svn cp (合并目标)URL (上线tag_MERGE_的tag对应)URL -m"commit log" |