Subversion常用操作总结

Subversion常用操作总结

徐东来,7.26.2007

 

一、 importcheckout

使用svn import来导入一个新项目到Subversion的版本库

使用svn checkout从版本库取出一个新拷贝

二、 基本工作周期

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

·   更新你的工作拷贝

o        svn update

·   做出修改

o        svn add

o        svn delete

o        svn copy

o        svn move

·   检验修改

o        svn status

o        svn diff

o        svn revert

·   合并别人的修改到工作拷贝

o        svn update

o        svn resolved

·   提交你的修改

o        svn commit

三、常用命令格式查询

·   svn add — 添加文件、目录或符号链

$ svn add foo.c
  
  
$ svn add testdir  #svn add缺省的行为方式是递归的
   
   
$ svn add --non-recursive otherdir
  
  
$ svn add * --force (添加所有工作拷贝的未版本化文件,包括那些隐藏在深处的文件)
   
   

  
  
   
    
  
  

·   svn blame — 显示特定文件和URL内嵌的作者和修订版本信息。很有意思,可以显示每一行源代码的作者和修订版本。

svn blame foo.c
  
  

  
  
   
    
  
  

·   svn cat — 输出特定文件或URL的内容。

svn cat foo.c
  
  
svn cat -rPREV foo.c  查看前一版本的内容
   
   

  
  
   
    
  
  

·   svn checkout — 从版本库取出一个工作拷贝。

常用选项
   
   
--revision (-r) REV
  
  
--quiet (-q)
  
  
--non-recursive (-N)
  
  
--username USER
  
  
--
  
  
   
   
    
    password
   
    
   
   
    
    PASS
   
   
  
  
  
  

  
  
   
    
  
  

·   svn cleanup — 递归清理工作拷贝。


  
  
   
    
  
  

·   svn commit — 将修改从工作拷贝发送到版本库。

选项
   
   
--message (-m) TEXT
  
  
--file (-F) FILE
  
  
--quiet (-q)
  
  
--non-recursive (-N)
  
  
$ svn commit -m "added howto section."
  
  
$ svn commit -F msg foo.c
  
  
$ svn commit --force-log --file file_under_vc.txt foo.c
  
  

  
  
   
    
  
  

·   svn copy — 拷贝工作拷贝的一个文件或目录到版本库。

这是恢复死掉文件的推荐方式!
   
   
$ svn copy file:///tmp/repos/test/far-away near-here
  
  

  
  
   
    
  
  
这是在版本库里作标签最简单的方法—svn copy那个修订版本(通常是HEAD)到你的tags目录。
   
   

$ svn copy file:///tmp/repos/test/trunk file:///tmp/repos/test/tags/ 0.6.32 -prerelease -m "tag tree"

 

不要担心忘记作标签你可以在以后任何时候给一个旧版本作标签:
   
   
$ svn copy -r 11 file:///tmp/repos/test/trunk file:///tmp/repos/test/tags/
  
  
   
   0.6.32
  
  -prerelease -m "Forgot to tag at rev 11"
  
  

  
  
   
    
  
  

·   svn delete — 从工作拷贝或版本库删除一个项目。

$ svn delete myfile
  
  
$ svn commit -m "Deleted file 'myfile'."
  
  

  
  
   
    
  
  
直接删除一个URL,你需要提供一个日志信息:
   
   
$ svn delete -m "Deleting file 'yourfile'" file:///tmp/repos/test/yourfile
  
  

  
  
   
    
  
  
强制删除本地已修改文件的例子:
   
   
$ svn delete --force over-there 
  
  

  
  
   
    
  
  

·   svn diff — 比较两条路径的区别。

比较BASE和你的工作拷贝(svn diff最经常的用法):
   
   
$ svn diff filename
  
  

  
  
   
    
  
  
察看你的工作拷贝对旧的修订版本的修改:
   
   
$ svn diff -r 3900 fileName
  
  

  
  
   
    
  
  
使用范围符号来比较修订版本30003500
   
   
$ svn diff -r 3000:3500 fileName
  
  

  
  
   
    
  
  
使用--diff-cmd CMD -x来指定外部区别程序
   
   
$ svn diff --diff-cmd /usr/bin/diff -x "-i -b" fileName
  
  

  
  
   
    
  
  

·   svn export — 导出一个干净的目录树。

从你的工作拷贝导出(不会打印每一个文件和目录):
   
   
$ svn export a-wc my-export
  
  
从版本库导出目录(打印所有的文件和目录):
   
   
$ svn export file:///tmp/repos my-export
  
  

  
  
   
    
  
  
当使用操作系统特定的分发版本,使用特定的EOL字符作为行结束符号导出一棵树会非常有用。--native-eol选项会这样做,但是如果影响的文件拥有svn:eol-style = native属性,举个例子,导出一棵使用CRLF作为行结束的树(可能是为了做一个Windows.zip文件分发版本):
   
   
$ svn export file://tmp/repos my-export --native-eol CRLF
  
  

  
  
   
    
  
  

·   svn import — 递归提交一个路径的拷贝到URL

选项
   
   
--message (-m) TEXT
  
  
--file (-F) FILE
  
  
--quiet (-q)
  
  
--non-recursive (-N)
  
  
--username USER
  
  
--
  
  
   
   
    
    password
   
    
   
   
    
    PASS
   
   
  
  
  
  

  
  
   
    
  
  
这会导入本地目录myproj到版本库的 根目录:
   
   
$ svn import -m "New import" myproj http://svn.red-bean.com/repos/test
  
  

  
  
   
    
  
  

·   svn info — 打印PATH的信息。

打印你的工作拷贝的路径信息,包括:
   
   
  路经
   
   
  名称
   
   
  URL
  
  
  修订版本
   
   
  节点类型
   
   
  最后修改的作者
   
   
  最后修改的修订版本
   
   
  最后修改的日期
   
   
  最后更新的文本
   
   
  最后更新的属性
   
   
  核对
   
   

  
  
   
    
  
  

·   svn list — 列出版本库目录的条目。

选项
   
   
--revision (-r) REV
  
  
--verbose (-v)
  
  
--recursive (-R)
  
  
--incremental
  
  
--xml
  
  
$ svn list --verbose file:///tmp/repos
  
  

  
  
   
    
  
  

·   svn log — 显示提交日志信息。

选项
   
   
--revision (-r) REV
  
  
--quiet (-q)
  
  
--verbose (-v)
  
  
--xml
  
  
$ svn log -r 14:15
  
  
$ svn log foo.c
  
  
$ svn log -r 20 touched.txt 
  
  

  
  
   
    
  
  

·   svn merge — 应用两组源文件的差别到工作拷贝路径。

将一个分支合并回主干(假定你有一份主干的工作拷贝,分支在修订版本250创建):
   
   
$ svn merge -r 250:HEAD http://svn.red-bean.com/repos/branches/my-branch
  
  

  
  
   
    
  
  
如果你的分支在修订版本23,你希望将主干的修改合并到分支,你可以在你的工作拷贝的分支上这样做: 
   
   
$ svn merge -r 23:30 file:///tmp/repos/trunk/vendors
  
  

  
  
   
    
  
  
合并一个单独文件的修改:
   
   
$ cd myproj
  
  
$ svn merge -r 30:31 thhgttg.txt 
  
  

  
  
   
    
  
  

·   svn mkdir — 创建一个纳入版本控制的新目录。

在工作拷贝创建一个目录:
   
   
$ svn mkdir newdir
  
  
在版本库创建一个目录(立即提交,所以需要日志信息): 
   
   
$ svn mkdir -m "Making a new dir." http://svn.red-bean.com/repos/newdir
  
  

  
  
   
    
  
  

·   svn move — 移动一个文件或目录。

移动工作拷bede一个文件:
   
   
$ svn move foo.c bar.c
  
  
A         bar.c
  
  
D         foo.c
  
  
移动版本库中的一个文件(一个立即提交,所以需要提交信息): 
   
   
$ svn move -m "Move a file" http://svn.red-bean.com/repos/foo.c /
  
  
                            http://svn.red-bean.com/repos/bar.c
  
  

  
  
   
    
  
  

·   svn resolved — 删除工作拷贝文件或目录的冲突状态。

删除工作拷贝文件或目录的conflicted状态。这个程序不是语义上的改变冲突标志,它只是删除冲突相关的人造文件,从而重新允许路径提交;也就是说,它告诉Subversion冲突已经解决了

例子:

如果你在更新时得到冲突,你的工作拷贝会产生三个新的文件:

$ svn update
  
  
C  foo.c
  
  
Updated to revision 31.
  
  
$ ls
  
  
foo.c
  
  
foo.c.mine
  
  
foo.c.r30
  
  
foo.c.r31
  
  
当你解决了foo.c的冲突,并且准备提交,运行
   
   
svn resolved让你的工作拷贝知道你已经完成了所有事情。 
   
   

警告:

你可以仅仅删除冲突的文件并且提交,但是svn resolved除了删除冲突文件,还修正了一些记录在工作拷贝管理区域的记录数据,所以我们推荐你使用这个命令。


  
  
   
    
  
  

·   svn revert — 取消所有的本地编辑。

丢弃对一个文件的修改:
   
   
$ svn revert foo.c
  
  

  
  
   
    
  
  
如果你希望恢复一整个目录的文件,可以使用--recursive选项: 
   
   
$ svn revert --recursive .
  
  

  
  
   
    
  
  

·   svn status — 打印工作拷贝文件和目录的状态。

status子命令能得到的所有信息:
   
   
$ svn status --show-updates --verbose filename
  
  

  
  
   
    
  
  

·   svn switch — 把工作拷贝更新到别的URL

如果你目前所在目录vendors分支到vendors-with-fix,你希望转移到那个分支: 
   
   
$ svn switch http://svn.red-bean.com/repos/branches/vendors-with-fix .
  
  
为了跳转回来,只需要提供最初取出工作拷贝的版本库URL 
   
   
$ svn switch http://svn.red-bean.com/repos/trunk/vendors .
  
  

  
  
   
    
  
  
$ svn switch --relocate file:///tmp/repos file:///tmp/newlocation .
  
  
小心使用--relocate选项,如果你输入了错误的选项,你会在工作拷贝创建无意义的URL,会导致整个工作区不可用并且难于修复。理解何时应该使用--relocate也是非常重要的,下面是一些规则: 
   
   
  如果工作拷贝需要反映一个版本库的新目录,只需要使用svn switch 
   
   
  如果你的工作拷贝还是反映相同的版本库目录,但是版本库本身的位置改变了,使用svn switch --relocate
   
   

  
  
   
    
  
  

·   svn update — 更新你的工作拷贝。

$ svn update
  
  
$ svn update -r30
  
  

  
  
   
    
  
  

  
  
   
    
  
  

·   如下是一些Subversion能够接受的日期格式,注意在日期中有空格时需要使用引号

$ svn checkout --revision {
  
  
   
   2002-02-17
  
  }
  
  
$ svn checkout --revision {15:30}
  
  
$ svn checkout --revision {15:30:00.200000}
  
  
$ svn checkout --revision {"2002-02-17 15:30"}
  
  
$ svn checkout --revision {"2002-02-17 15:30 +0230"}
  
  
$ svn checkout --revision {
  
  
   
   2002-02-17
  
  T15:30}
  
  
$ svn checkout --revision {
  
  
   
   2002-02-17
  
  T15:30Z}
  
  
$ svn checkout --revision {
  
  
   
   2002-02-17
  
  T15:30-04:00}
  
  
$ svn checkout --revision {20020217T1530}
  
  
$ svn checkout --revision {20020217T1530Z}
  
  
$ svn checkout --revision {20020217T1530-0500}
  
  

·   修订版本关键字的使用

$ svn diff --revision PREV:COMMITTED foo.c
  
  
# shows the last change committed to foo.c
  
  

  
  
   
    
  
  
$ svn log --revision HEAD
  
  
# shows log message for the latest repository commit
  
  

  
  
   
    
  
  
$ svn diff --revision HEAD
  
  
# compares your working file (with local mods) to the latest version
  
  
# in the repository.
  
  

  
  
   
    
  
  
$ svn diff --revision BASE:HEAD foo.c
  
  
# compares your “pristine” foo.c (no local mods) with the 
  
  
# latest version in the repository
  
  

  
  
   
    
  
  
$ svn log --revision BASE:HEAD
  
  
# shows all commit logs since you last updated
  
  

  
  
   
    
  
  
$ svn update --revision PREV foo.c
  
  
# rewinds the last change on foo.c.
  
  
# (foo.c's working revision is decreased.)
  
  

  
  
   
    
  
  
$ svn log --revision {
  
  
   
   2002-11-28
  
  }
  
  
$ svn log --revision {
  
  
   
   2002-11-20
  
  }:{
  
  
   
   2002-11-29
  
  }
  
  

 

参考:

http://svnbook.red-bean.com/ svn-book

http://www.subversion.org.cn/tsvndoc/  TortoiseSVN手册,windows下的一种subversion客户端

 

 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值