zoukankan      html  css  js  c++  java
  • 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 常用命令一览表

     

  • 相关阅读:
    [Algorithms] Counting Sort
    [LeetCode] Sort Colors
    [LeetCode] Contains Duplicate III
    [LeetCode] Contains Duplicate
    [LeetCode] Two Sum II
    [LeetCode] Linked List Cycle II
    [LeetCode] Linked List Cycle
    [LeetCode] Longest Palindromic Substring
    [LeetCode] Two Sum
    [LeetCode] Rectangle Area
  • 原文地址:https://www.cnblogs.com/wzxNote/p/5687558.html
Copyright © 2011-2022 走看看