SVN

2023-05-16

转自:http://blog.csdn.net/gexiaobaohelloworld/article/details/7752862

SVN简介

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

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

.svn目录包含什么

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

SVN常用命令

svn  help:帮助

svn help

svn help ci

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

svn checkout path

简写:svn co path

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

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

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

svn add file

说明1:svn add 默认忽略.so 和.a库文件,需要使用--no-ignore选项使其不忽略库文件;

说明2:只是将file纳入版本控制,要等到下次提交时才会真正添加到svn服务器;

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

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

svn commit -m “LogMessage” PATH

简写:svn ci -m “” files

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

svn lock:加锁/解锁

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

svn unlock PATH

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

svn up:更新本地副本到某个版本

svn update -r m path

简写:svn up

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

说明:svn up不会改变已修改的本地副本文件;

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

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

svn status path

简写:svn st

1)svn st path(目录下的文件和子目录的状态,正常状态不显示)

说明:【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】

2)svn st -v path(显示文件和子目录状态)

说明:【第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。】

说明:path省略则显示当前目录的文件状态;

注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。

例如: svn st -q (只显示本地修改条目信息)


svn status可能返回的状态码

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

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

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

文件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。

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

svn del:删除文件

svn delete path 

简写:svn (del, remove, rm)

说明:只是纳入版本控制,会在下次提交时从svn服务器中删除;所以一般都会紧跟着提交一次该文件;

svn log:查看日志

svn log path

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

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

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

svn info:查看文件详细信息

svn info path

例如: svn info test.php

svn diff:比较差异

1)svn diff path(将本地副本与svn服务器上的文件比较)

例如: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  

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

svn merge -r m:n path

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

svn mkdir:创建新目录

svn mkdir

说明:创建纳入版本控制下的新目录,相当于mkdir file; svn add file。

svn revert:恢复本地修改

svn revert PATH

说明: 主要用来恢复文件的SVN状态,比如一个SVN下文件是A(add),D(delete),M(modify)状态,那么用svn revert可以恢复该文件到原来的“SVN状态”;如svn add纳入版本控制后在取消纳入版本控制。

svn resolved:解决冲突

svn resolved PATH

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

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


SVN服务器更换地址解决方法

1。查看仓库地址(URL)
 
  #> svn info
  路径:.
  地址(URL):http://192.168.28.1/repos/test
  档案库 UUID:a81f9bed-3506-0410-b369-e50476f75162
  修订版:44
  节点种类:目录
  调度:正常
  最后修改的作者:yanghong
  最后修改的修订版:44
  最后修改的时间: 2005-11-24 16:05:30 +0800 (四, 24 11月 2005)
 
  可以看到地址为:"http://192.168.28.1/repos/test"
 
  2。更改仓库地址(URL)
 
  #> svn switch --relocate http://192.168.28.1/repos/test https://192.168.28.1/repos/test
  验证“https://192.168.28.1:443”的服务器凭证时发生错误:
  - 本凭证并不是由受信任的权威机权所核发。请手动利用指纹以验证
  凭证的有效性!
  - 本凭证的主机名称不符。
  凭证信息:
  - 主机名称:(www|svn|ftp|developers).cocreate.com.cn
  - 有效期间:自 Dec 22 02:52:50 2005 GMT 至 Jan 21 02:52:50 2006 GMT
  - 发行者:Co-Create Open Source Software Co.,Ltd., BeiJing, BeiJing, CN
  - 指纹:63:62:b9:9e:61:c2:10:d2:ae:49:81:87:a3:57:a8:e4:76:42:6f:c8
  (R)拒绝,(t)暂时接受 或 (p)永远接受?p
 
  Q:我的SVN服务器换地址了,我在客户端要做什么变化?
 
  A:
  1,将当前的用户在SVN客户端当前路径切换到当初更新SVN的位置上.
  2,执行命令:svn switch --relocate (Old Repository Root) (New Repository Root)
  Old Repository Root可以通过:svn info来查看.
  3,svn update就可以正常的更新你的系统了.
 
  附SVN INFO的内容范例:
  $ svn info
  Path: .
  URL: http://svn.svn.com/ProjectName/Trunk/Project
  Repository Root: http://svn.svn.com/ProjectName
  Repository UUID: 149e7728-2900-0410-bded-c30b68e36566
  Revision: Numbver
  Node Kind: directory
  Schedule: normal
  Last Changed Author: Programmer Nme
  Last Changed Rev: Number
  Last Changed Date: 2009-02-14 12:39:08 +0800 (Sat, 14 Feb 2009)


解决冲突

要解决冲突,我们首先得制造个冲突,保证你现在已经有两个工作拷贝了,我们现在修改其中的一个,例如这里我们修改sally_calc中的main.c文件。

root@letuknowit:/home/kris/sally_calc/trunk# cat main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
        printf("5 + 10 = %d.\n",add(5,10));
        printf("15 - 10 = %d.\n",sub(15,10));
        //sally's test
        printf("sally: 60 - 33 = %d.\n",sub(60,33));
        return 0;
}
  

在这里sally增加了一个属于她自己的测试语句,改好后,提交到svn


root@letuknowit:/home/kris/sally_calc/trunk# svn ci -m "sally add some test code"
Sending        trunk/main.c
Transmitting file data .
Committed revision 7.
  

下面回到kris的工作副本,做类似的修改,具体如下


root@letuknowit:/home/kris/calc/trunk# cat main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
        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));
        return 0;
}
  

好了,下面的工作自然是提交了。


root@letuknowit:/home/kris/calc/trunk# svn ci -m "kris add some test code"
Sending        trunk/main.c
svn: Commit failed (details follow):
svn: File '/trunk/main.c' is out of date
  

很抱歉,提交失败了,原因是本地文件过期了(因为之前sally提交了对于main.c的修改)。原来如此,赶紧把sally的修改update过来。不过在这之前提供一个检测本地文件是否已经过期的办法,还记得经常用到的svn st命令吧


root@letuknowit:/home/kris/calc/trunk# svn st
M       main.c
root@letuknowit:/home/kris/calc/trunk# svn st -u
M       *        6   main.c
Status against revision:      7
  

看到那个*了吧,出现这个标记就说明本地副本的文件已经过期了,需要执行svn update了。


root@letuknowit:/home/kris/calc/trunk# svn up
Conflict discovered in 'main.c'.
Select: (p) postpone, (df) diff-full, (e) edit,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options:
  

额滴个小心脏啊,又出错了,还要做选择题,纠结啊,纠结前还是看看各个选项都是做啥的吧


(p) postpone          暂时推后处理,我可能要和那个和我冲突的家伙商量一番
(df) diff-full        把所有的修改列出来,比比看
(e) edit              直接编辑冲突的文件
(mc) mine-conflict    如果你很有自信可以只用你的修改,把别人的修改干掉
(tc) theirs-conflict  底气不足,还是用别人修改的吧
(s) show all options  显示其他可用的命令
  

这里我们先选择p稍候处理,系统会给出如下输出,main.c前面的C标识说明这是一个冲突中的文件,需要手工处理以解决冲突。


        (s) show all options:p
C    main.c
Updated to revision 7.
Summary of conflicts:
  Text conflicts: 1
  

如果这个时候你查看一下工作拷贝,你会发现多了几个文件,对于每一个冲突的文件,svn会放置三个额外的未版本化文件到你的工作拷贝。


root@letuknowit:/home/kris/calc/trunk# ls -al m*
-rw-r--r-- 1 root root 312 2012-09-20 16:35 main.c
-rw-r--r-- 1 root root 216 2012-09-20 16:35 main.c.mine
-rw-r--r-- 1 root root 156 2012-09-20 16:35 main.c.r6
-rw-r--r-- 1 root root 218 2012-09-20 16:35 main.c.r7
  

其中main.c.mine是融合了你的修改的版本,里面是你更新的内容,main.c.r6是你做更新操作以前的版本,你是在这个版本的基础上做的修改,main.c.r7是版本库中的最新版本,这里有别人的修改,而就是这个修改和你的修改冲突了。这几个文件可以自己去查看下,应该很好理解。
对了,还有主角没有登场,这个时候如果你看下mian.c的内容,估计你又要郁闷了,和你原先的修改完全不一样了。


root@letuknowit:/home/kris/calc/trunk# cat main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
        printf("5 + 10 = %d.\n",add(5,10));
        printf("15 - 10 = %d.\n",sub(15,10));
<<<<<<< .mine
        //kris's test
        printf("kris: 12 + 28 = %d.\n",add(12,28));
=======
        //sally's test
        printf("sally: 60 - 33 = %d.\n",sub(60,33));
>>>>>>> .r7
        return 0;
}
  

你会看到由小于号、等于号和大于号串组成的三个部分,其中小于号和等号之间的内容是你的修改,而等号和大于号之间的修改是其他人的修改,在明确了冲突的原因之后,我们已经知道怎么修改了,两个人的修改都是需要保留的。
OK,那就保留所有的修改,删除掉<、=和>,最后的结果如下。
小于号、等于号和大于号串是冲突标记,并不是冲突的数据,你一定要确定这些内容在下次提交之前得到删除。


root@letuknowit:/home/kris/calc/trunk# cat main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
        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));
        //sally's test
        printf("sally: 60 - 33 = %d.\n",sub(60,33));
        return 0;
}
  

冲突解决了,下面的工作就是通知svn,我们已经把冲突搞定了(使用svn resolved命令),下面该你了,可以看到svn将生成的几个临时文件删除了。


root@letuknowit:/home/kris/calc/trunk# svn resolved main.c
Resolved conflicted state of 'main.c'
root@letuknowit:/home/kris/calc/trunk# ls -al m*
-rw-r--r-- 1 root root 278 2012-09-20 17:07 main.c
  

接下来提交代码,搞定收工。


root@letuknowit:/home/kris/calc/trunk# svn ci -m "kris add some test code"
Sending        trunk/main.c
Transmitting file data .
Committed revision 8.
  

svn中的冲突解决看起来非常的复杂,实则很简单,只要掌握了原理,举一反三,就可以得心应手了!
原创文章请注明转载于知蚁博客,本文地址:http://www.letuknowit.com/archives/svn-conflict-resolution





     
   
     
    
     
   
  
   
  
  
  
   
     
  
  
  
   
   
  
     
  
  
   
  
  
 
 
 
 
  
 
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SVN 的相关文章

  • 没有分支的 svn 存储库签出

    我必须检查一个有 8 个分支的存储库 我不会下载每个分支大小 400MB 只需检查文件夹结构和主干即可 repo trunk repo tags
  • 在 Subversion 中,如何取消劫持文件?

    目前 我的团队有一组不应该受到版本控制的文件 但它们确实受到了版本控制 我想从我们的 subversion 存储库中删除它们 并允许每个人保留他们的本地版本 实现这一目标的最佳方法是什么 删除文件会将它们从存储库以及每个人的本地文件系统中删
  • 将 git dcommits 切换到 svn 分支

    I had master dcommit到 和rebase来自 颠覆trunk 我创建了一个中间 Subversion 分支tc 合并来自 2 个不同分支的更改 使用 git branch master git svn branch tc
  • 如何从 Chrome 扩展示例(subversion 存储库)下载所有文件?

    我要下载这个例子 http src chromium org viewvc chrome trunk src chrome common extensions docs examples api tabs 它们是使用 ViewVC 显示的
  • 使用 Git 处理 subversion:忽略对跟踪文件的修改

    我目前正在使用 subversion 存储库 但我正在使用 git 在我的计算机上本地工作 它使工作变得更加容易 但也使 subversion 存储库中发生的一些不良行为变得非常明显 这给我带来了问题 拉取代码后 有一个有点复杂的本地构建过
  • ASP.NET 显示 SVN 修订号

    我在 Stack Overflow 页脚中看到显示了 SVN 修订号 这是自动化的吗 如果是的话 如何在 ASP NET 中实现它 其他语言的解决方案也是可以接受的 确保该文件有 svn keywords Rev Id 然后把 Rev 在那
  • svn:'REPO URL 的选项:授权失败:

    我使用两个命令 1 svn ls 带有用户名和密码 2 svn mkdir 带有用户名和密码 svn ls 工作没有任何问题 但 svn mkdir 失败并显示以下错误消息 svn REPO URL 的选项 授权失败 无法向服务器进行身份验
  • IIS7 和 ARR 作为 Subversion 的反向代理

    我使用 IIS7 和应用程序请求路由扩展来充当 Apache 上运行的 Subversion 的反向代理 代理工作正常 我能够探索服务器 甚至执行 签出 但是 我无法浏览 ASP NET 通常禁止的文件 例如 cs csproj 等 ASP
  • 如何只检出在一系列 SVN 修订版中修改过的文件?

    是否可以仅从 SVN 存储库中签出在一个修订版或修订版范围内修改过的文件 而不签出任何未修改的文件 我的建议与弗洛洛的建议相同 但是 需要一个范围 您可以使用以下 shell 函数 function checkout files in re
  • 合并来自并行 Subversion 存储库的更新代码

    我想知道人们在将实时 持续更新的 SVN 存储库与离线存储库 更新频率较低 合并时通常会采取哪些步骤 以我的场景为例 不久前我下载了BugTracker NET系统 当时它的版本是3 2 3 随后我对我们业务的代码进行了一些增强 我们使用
  • SVN:您可以仅从本地签出(而不是从存储库)中删除目录吗?

    假设您有一个受 subversion 控制的目录 其中包含一些文件和大量子目录 如下所示 file1 txt file2 txt file3 txt dir1 dir2 dir3 dir4 dirXX 现在您需要文件和一些目录 但不是全部
  • Subversion 中的版本和项目的良好存储库布局是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们有标准的 Subversion 主干 分支 标签布局 我们有几个针对中长期项目的分支 但到目前为止还没有一个发布版本 这正在快速逼近 我们应
  • SVN 不会缓存凭据

    我正在使用命令行 svn 客户端 版本 1 6 12 来自 Ubuntu 存储库 但我似乎无法让它缓存我的用户凭据 我正在尝试访问 https svn 存储库 类似于https subversion FAKE com PROJECT htt
  • 在 Ubuntu 上通过 Apache Web 服务器和 DAV 启用 Subversion 访问

    我的家庭网络上有一台运行 Ubuntu 20 的 PC 我想将其用作我家本地网络中的 Subversion 服务器 我安装了 Apache Web 服务器并安装了 Subversion 现在我想使用 HTTP DAV 协议通过 Apache
  • 如何在Windows控制台中递归使用“svn add”?

    当我跑步时 svn st 在我的工作副本上我得到一些 位于工作副本根目录的子目录中的条目 我想将它们全部添加到存储库中 我尝试 svn add force and svn add force 但它不起作用 工作方案 svn add dept
  • GitHub 的 Subversion 版本? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 PHP 页面中嵌入 svn 修订号的简单方法?

    注意到这个页面的右下角有 SVN 修订 ID 了吗 我假设这是动态的 我很乐意将其添加到我的一些网站中 就像源代码中的注释一样 以确保代码推送顺利进行 注意 您还可以假设相关站点的工作目录是相关存储库的 svn checkout Edit
  • Xuggler 存储库链接已损坏

    在我的 JAVA 应用程序中 我使用 Xuggler 来实现 ScreenCapture 和其他功能 现在它是一个 Maven 项目 所以我将 Xuggler 作为 Pom xml 中的依赖项 如此处所示Link http www xugg
  • 如何配置hudson忽略指定SVN文件夹下的更改?

    我正在寻找一种方法来忽略 Hudson 中指定 SVN 文件夹下的更改 这与 TeamCity 中的排除文件夹和 CC Net 中的过滤器相同 我在SVN GUI配置下没有找到任何配置选项 在 Hudson 1 334 中 在构建配置中的
  • 持续集成颠覆

    抱歉 如果这个问题的答案已经存在 我还没有找到 我是网络开发团队的成员 我们维护一个网络门户 发布管理与 Subversion 配合使用 这就是我向门户添加新功能时的工作方式 通过复制 Trunk 创建新的 Branch 在那个分支发展 定

随机推荐