linux-svn命令

1,SVN简介

SVN(Subversion)是一个自由、开源的项目源代码版本控制工具。目前,绝大多数开源软件和企业代码管理,都使用SVN作为代码版本管理软件。SVN将文件存放在中心版本库里,这个版本库很像一个普通的文件服务器。不同的是,它可以记录每一次文件和目录的修改情况,这样就可以在需要的回滚时,将数据恢复到以前的版本,并可以查看数据的更改细节。

因为你的工作拷贝“同你系统上的文件和目录没有任何区别”,你可以随意修改文件,但是你必须告诉Subversion你做的其他任何事。例如,你希望拷贝或移动工作拷贝的一个文件,你应该使用svn copy或者 svn move而不要使用操作系统的拷贝移动命令。

.svn目录包含什么?

工作拷贝中的任何一个目录包括一个名为.svn管理区域,通常列表操作不显示这个目录,但它仍然是一个非常重要的目录,无论你做什么?不要删除或是更改这个管理区域的任何东西,Subversion使用它来管理工作拷贝。如果你不小心删除了子目录.svn,最简单的解决办法是删除包含的目录(普通的文件系统删除,而不是svn delete),然后在父目录运行svn update,Subversion客户端会重新下载你删除的目录,并包含新的.svn。 

2,SVN常用命令

2.1、svn co:将文件checkout到本地目录

svn checkout path

简写:svn co path

说明:path是服务器上的目录

例如:svn co svn://192.168.1.1/pro/domain

2.2、svn add:往版本库中添加新的文件

svn add file

说明:不能直接使用 svn add * 命令,必须使用 “svn add * --force” 命令。--force参数只不过是驱使 svn 去检查一个子目录,而不管这个子目录是否已经纳入管理。

例如:svn add *.php(添加当前目录下所有的php文件)

2.3、svn ci:将改动的文件提交到版本库

svn commit -m “LogMessage” [-N] [--no-unlock] PATH(如果选择了保持锁,就使用–no-unlock开关)

简写:svn ci -m ‘’

例如:svn ci -m “add test file for my test“ test.php

2.4、svn lock:加锁/解锁

svn lock -m “LockMessage” [--force] PATH

svn unlock PATH

例如:svn lock -m “lock test file“ test.php

2.5、svn up:更新到某个版本

svn update -r m path

简写:svn up

说明:svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。

例如:svn up -r 200 test.php(将版本库中的文件test.php还原到版本200)

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. Select: (p) postpone, (df) diff-full, (e) edit,  
  2.         (mc) mine-conflict, (tc) theirs-conflict,  
  3.         (s) show all options:  
  4. svn detects that theres a conflict here and require you to take some kind of action.  
  5.   
  6. (e)  edit             - change merged file in an editor               #直接进入编辑  
  7. (df) diff-full        - show all changes made to merged file          #显示更改至目标文件的所有变化  
  8. (r)  resolved         - accept merged version of file  
  9.   
  10. (dc) display-conflict - show all conflicts (ignoring merged version)  #显示所有冲突  
  11. (mc) mine-conflict    - accept my version for all conflicts (same)    #冲突以本地为准  
  12. (tc) theirs-conflict  - accept their version for all conflicts (same) #冲突以服务器为准  
  13.   
  14. (mf) mine-full        - accept my version of entire file (even non-conflicts)#完全以本地为准  
  15. (tf) theirs-full      - accept their version of entire file (same)    #完全以服务器为准  
  16.   
  17. (p)  postpone         - mark the conflict to be resolved later        #标记冲突,稍后解决  
  18. (l)  launch           - launch external tool to resolve conflict  
  19. (s)  show all         - show this list  

举例如下:

1,创建test.txt

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. test  

2,上传该文件,版本为revision3

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. C:workspace est>svn ci -m "making a starting point"  
  2. Sending        .  
  3. Sending        test.txt  
  4. Transmitting file data .  
  5. Committed revision 2.  

3,假设我们有User1和User2. 二者均从repository中update下载该文件,版本为revision2

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. C:workspace est>svn up  
  2. A    test.txt  
  3. At revision 2.  

4,User1修改文件test.txt

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. User1 is making a conflict test  

5,User1上传文件test.txt  版本为revision3

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. C:workspace est>svn ci -m "User1 starting a conflict"  
  2. Sending        .  
  3. Sending        test.txt  
  4. Transmitting file data .  
  5. Committed revision 3.  

6,User2修改文件test.txt

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. test User2 making a conflict  

7,User2上传文件test.txt,版本为revision4,遇到错误

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. svn: Commit failed (details follow):  
  2. svn: File or directory 'test.txt' is out of date; try updating  
  3. svn: resource out of date; try updating  

8,User2开始更新文件

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. C:workspace est>svn up  
  2. Conflict discovered in 'test.txt'.  
  3. Select: (p) postpone, (df) diff-full, (e) edit,  
  4.         (mc) mine-conflict, (tc) theirs-conflict,  
  5.         (s) show all options:  
  6. svn detects that theres a conflict here and require you to take some kind of action.  

9,User2选择‘df’,展开冲突的内容

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. Select: (p) postpone, (df) diff-full, (e) edit,  
  2.         (mc) mine-conflict, (tc) theirs-conflict,  
  3.         (s) show all options: df  
  4. --- .svn/text-base/test.txt.svn-base    Tue Aug 10 10:59:38 2010  
  5. +++ .svn/tmp/test.txt.2.tmp     Tue Aug 10 11:33:24 2010  
  6. @@ -1 +1,3 @@  
  7. -test  
  8.  No newline at end of file  
  9. +<<<<<<< .mine +test User2 making conflict======= +User1 is making a conflict test>>>>>>> .r3  

10,User2选择‘e’,可编辑冲突的内容

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. <<<<<<< .mine test User2 making conflict======= User1 is making a conflict test>>>>>>> .r3  

11,User2按如下方式编辑了冲突并保存:

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. User1 is making a conflict test User2 making conflict  

12,User2重新选择‘r’,表示resolved并被标记为G(表示该文件冲突已被解决)

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved,  
  2.         (mc) mine-conflict, (tc) theirs-conflict,  
  3.         (s) show all options: e  
  4. Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved,  
  5.         (mc) mine-conflict, (tc) theirs-conflict,  
  6.         (s) show all options: r  
  7. G    test.txt  
  8. Updated to revision 3.  

13,User2检查该文件状态

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. C:workspace est2>svn st  
  2. M       test.txt  

14,User2提交该文件,版本为revision4

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. C:workspace est2>svn ci -m "conflict resolved"  
  2. Sending        test.txt  
  3. Transmitting file data .  
  4. Committed revision 4.  

15,User2刚才也可以选择‘p’来延迟解决冲突

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved,  
  2.         (mc) mine-conflict, (tc) theirs-conflict,  
  3.         (s) show all options: p  
  4. C    test.txt  
  5. Updated to revision 3.  
  6. Summary of conflicts:  
  7.   Text conflicts: 1  

16,这时会发现svn帮助建立了如下三个文件

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. 08/10/2010  11:44 AM                94 test.txt  
  2. 08/10/2010  11:44 AM                26 test.txt.mine  
  3. 08/10/2010  11:44 AM                27 test.txt.r2  
  4. 08/10/2010  11:44 AM                31 test.txt.r3  
  5. test.txt为包含User1与User2冲突的文件  
  6. <<<<<<< .mine test User2 making conflict======= User1 am making a conflict test>>>>>>> .r3  

test.txt.mine是User2的本地文件

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. test User2 making conflict  

test.txt.r2为原始reversion2的拷贝

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. test  

test.txt.r3为User1提交的reversion3的拷贝

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. User1 is making a conflict test  

17,此时User2修改了test.txt的冲突并提交

[plain] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. C:workspace est>svn resolve --accept working test.txt  
  2. Resolved conflicted state of 'test.txt'  
  3. C:workspace est>svn ci -m "conflict resolved"  
  4. Sending        test.txt  
  5. Transmitting file data .  
  6. Committed revision 4.  

2.6、svn st:查看文件或者目录状态

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 st -q (只显示本地修改条目信息)

svn status可能返回的状态码

文件、目录或是符号链item预定加入到版本库。

文件item发生冲突,在从服务器更新时与本地版本发生交迭,在你提交到版本库前,必须手工的解决冲突。

文件、目录或是符号链item预定从版本库中删除。

文件item的内容被修改了。

文件、目录或是符号链item预定将要替换版本库中的item,这意味着这个对象首先要被删除,另外一个同名的对象将要被添加,所有的操作发生在一个修订版本。

目录没有版本化,但是与Subversion的外部定义关联,关于外部定义,可以看“外部定义”一节。

文件、目录或是符号链item不在版本控制之下,你可以通过使用svn status的--quiet(-q)参数或父目录的svn:ignore属性忽略这个问题。

文件、目录或是符号链item在版本控制之下,但是已经丢失或者不完整,这可能因为使用非Subversion命令删除造成的,如果是一个目录,有可能是检出或是更新时的中断造成的,使用svn update可以重新从版本库获得文件或者目录,也可以使用svn revert file恢复原来的文件。

文件、目录或是符号链item在版本库已经存在,但你的工作拷贝中的是另一个。举一个例子,你删除了一个版本库的文件,新建了一个在原来的位置,而且整个过程中没有使用svn delete或是svn add。

文件、目录或是符号链item不在版本控制下,Subversion已经配置好了会在svn add、svn import和svn status命令忽略这个文件。注意,这个符号只会在使用svn status的参数--no-ignore时才会出现—否则这个文件会被忽略且不会显示!


2.7、svn del:删除文件

svn delete path -m “delete test fle”

简写:svn (del, remove, rm)

例如:先,svn delete test.php     再,svn ci -m ‘delete test file‘

2.8、svn log:查看日志

svn log path

例如:svn log  -l 3 test.php 显示这个文件的最近三条修改记录,及其版本号的变化

例如:svn log file -r 204424显示 r204424这个版本的提交信息

例如:svn log file -r 204424 -v 详细显示 r204424这个版本的提交记录

2.9、svn info:查看文件详细信息

svn info path

例如:svn info test.php

2.10、svn diff:比较差异

1)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  

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. root@letuknowit:/home/kris/calc/trunk# svn diff main.c  
  2. Index: main.c  
  3. ===================================================================  
  4. --- main.c      (revision 8)  
  5. +++ main.c      (working copy)  
  6. @@ -7,7 +7,8 @@  
  7.         printf("5 + 10 = %d. ",add(5,10));  
  8.         printf("15 - 10 = %d. ",sub(15,10));  
  9.         //kris's test  
  10. -       printf("kris: 12 + 28 = %d. ",add(12,28));  
  11. +       printf("kris: 32 + 28 = %d. ",add(32,28));  
  12. +       printf("kris: 15 - 10 = %d. ",sub(15,10));  
  13.         //sally's test  
  14.         printf("sally: 60 - 33 = %d. ",sub(60,33));  
  15.         return 0;  

svn diff可以查看当前工作拷贝中所有的被修改的文件,对于每个文件的diff输出部分由Index: 文件名的形式进行区分。等于号后面的内容就是关于main.c文件的diff情况了。

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. --- main.c      (revision 8)  
  2. +++ main.c      (working copy)  

--- 打头的是原始文件,也就是版本库中的最新版本,或者理解为修改前的文件
+++ 打头的是目标文件,这个就是你修改后的版本

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. @@ -7,7 +7,8 @@  

这里的-和+分别表示原始文件和目标文件,7,7表示从第7行开始的7行,-7,7就是原始文件的从第7行开始的7行内容,+7,8的意思类似,表示目标文件从第7行开始的8行内容。

结合起来理解就是:目标文件从第7行开始的8行内容和原始文件的从第7行开始的7行内容之间存在差异

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1.         printf("5 + 10 = %d. ",add(5,10));  
  2.         printf("15 - 10 = %d. ",sub(15,10));  
  3.         //kris's test  
  4. -       printf("kris: 12 + 28 = %d. ",add(12,28));  
  5. +       printf("kris: 32 + 28 = %d. ",add(32,28));  
  6. +       printf("kris: 15 - 10 = %d. ",sub(15,10));  
  7.         //sally's test  
  8.         printf("sally: 60 - 33 = %d. ",sub(60,33));  
  9.         return 0;  

这个就是具体的差异情况了,前面的-号表示需要从原始文件中删除的行,+号表示目标文件中将要增加的行,-号开头的部分只属于原始文件,+号开头的部分只属于目标文件,其余的是两者相同的部分。

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1.  7   1   1         printf("5 + 10 = %d. ",add(5,10));  
  2.  8   2   2         printf("15 - 10 = %d. ",sub(15,10));  
  3.  9   3   3         //kris's test  
  4. 10   4     -       printf("kris: 12 + 28 = %d. ",add(12,28));  
  5. 11       4 +       printf("kris: 32 + 28 = %d. ",add(32,28));  
  6. 12       5 +       printf("kris: 15 - 10 = %d. ",sub(15,10));  
  7. 13   5   6         //sally's test  
  8. 14   6   7         printf("sally: 60 - 33 = %d. ",sub(60,33));  
  9. 15   7   8         return 0;  

为了进一步了解@@ -7,7 +7,8 @@的意思,上面加上了行号等信息,第一列的数字是行号,后面两列的数字表示第几行。经过标注可以清晰的看出原始文件第7行开始的7行和目标文件第7行开始的8行内容了。

2.11、svn merge:将两个版本之间的差异合并到当前文件

svn merge -r m:n path

例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)

2.12、svn  help:帮助

svn help

svn help ci

2.13、svn mkdir:创建新目录

svn mkdir

说明:创建纳入版本控制下的新目录。

2.14、svn revert:恢复本地修改

svn revert PATH

说明: 主要用来恢复文件的SVN状态,比如一个SVN下文件是A(add),D(delete),M(modify)状态,那么用svn revert可以恢复该文件到原来的“SVN状态”。

2.15、svn resolved:解决冲突

svn resolved PATH

说明:移除工作副本的目录或文件的“冲突”状态。
注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的相关文件,然后让 PATH 可以再次提交。

2.16、svn import:导入

使用svn import是把未版本化的文件树复制到资料库的快速办法,它需要创建一个临时目录。 

[python] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. $ svnadmin create /usr/local/svn/newrepos  
  2. $ svn import mytree file:///usr/local/svn/newrepos/some/project  
  3. Adding         mytree/foo.c  
  4. Adding         mytree/bar.c  
  5. Adding         mytree/subdir  
  6. Adding         mytree/subdir/quux.h  
  7.   
  8.   
  9. Committed revision 1.  

上面的例子把在some/project目录下mytree目录的内容复制到资料库中。 

[python] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. $ svn list file:///usr/local/svn/newrepos/some/project  
  2. bar.c  
  3. foo.c  
  4. subdir/  

注意在导入完成后,原来的树没有被转化成一个工作副本。为了开始工作,你仍然需要svn checkout这个树的一个新的工作副本。

2.17 svn diff --summarize:分支diff打包

在某个分支上,都是自己的代码,需要最终合线,可以只将之前的diff找出来打包

[plain] view plain copy
 
  1. svn diff --summarize -r37565:37571 | awk '{print $2}' | xargs tar czvf  backup_$(date +%F).tar.gz  
[plain] view plain copy
 
  1. tar -czvf test_diff.tar.gz `svn di --summarize -r41413:41408| awk '{print $2}' `    

注意,在查找原来版本和最新版本时,svn log 默认是当前目录的log记录。不一定是整个代码树的最新log。所以建议使用URL来查找。

[plain] view plain copy
 
  1. svn log https://develop/genericbranch_7 | less  



2.18 创建一个新的分支

[cpp] view plain copy
 
  1. svn cp -m "create new branch" http://online -r 38577 http://branch_7  



3,svn一般查日志流程

更新代码:svn up   
查看日志:svn log 
查看具体修改信息:svn diff -c r208425
svn恢复具体版本:svn revert -r 208425
 

4,典型的工作周期是这样的:

更新你的工作拷贝
svn update
做出修改
svn add
svn delete
svn copy
svn move
检验修改
svn status
svn diff
可能会取消一些修改
svn revert
解决冲突(合并别人的修改)
svn update
svn resolved
提交你的修改
svn commit
 

5,SVN 常用命令一览表

 

原文地址:https://www.cnblogs.com/wzxNote/p/5687558.html