Subversion常用操作总结
徐东来,7.26.2007
ä¸ãimport和checkout
使用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
--passwordPASS
·  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
使用范围符号来比较修订版本3000和3500
$ 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
--passwordPASS
这会导入本地目录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-17T15:30}
$ svn checkout --revision {2002-02-17T15:30Z}
$ svn checkout --revision {2002-02-17T15: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客户端