注:本文档主要是自己平时svn使用总结,加上命令简析以供将来查询之便。
SVN 的基本指令介绍,主要参考:
- SubTrain - Open Source Trainings for Subversion: 教导如何使用 SVN
- Version Control with Subversion
- Version Control with Subversion(中文版电子书)
- Version Control with Subversion PDF - 相当实用的介绍和说明
SubTrain 的 PPT 前面頁数看一看, 基础就大概知道了,后面的都是进阶方面的东西,一般使用不到。
先來看 SVN Trunk/Tags/Branches 目录的架构和用途:
- trunk: Main line of development(主干, 主要开发都在此 trunk)
- tags: Releases (想要 Release 的时候, 就标个Tag,以后可以依据此tag来找回之前版本)
- branches: Preparation of release, bug fixing(分支, 可以將某些功能切出來, 或者 bug fix 等切成分支, 等做完再用 Merge 合并回來)
SVN 文件状态:
- ?: 此文件不存在 SVN 里面
- A: 此次新增的文件
- C: 此文件已经有人改过, 修改不成功, 需要人工介入
- D: 此次删除的文件
- M: 此文件有修改过
- U: 此文件有被更新过
- K: 此文件被锁定
- G: 表示项目创建库中的文件和本地工作拷贝的文件合并到了一起
SVN 基本功能:
1. 递归提交一个新路径(新目录及其下面的文件和子目录)的拷贝到版本库
svn import [path] URL
- svn import project_directory http://DOMAIN/svn_project
- svn import project_directory file:///SVN_PATH/svn_project
例子:将本地目录myproj
导入到版本库的trunk/misc,
trunk/misc
在导入之前不需要
存在—svn import会递归的为你创建目录。
svn import myproj http://svn.red-bean.com/repos/trunk/misc
说明:上述操作后,不会在版本库中创建目录myproj,如果你希望创建,需在URL后面加上
myproj。....../trunk/misc/myproj
此时,本地的目录树并没有纳入版本控制,
需要在执行命令 svn checkout才可以。
2. svn export
导出一个干净的不带.svn文件夹的目录树
一般默认下载最新的代码!
如果你想要下载指定版本的工程的话用:
svn export -r 2232 http://10.11.22.11/svn/project001
-r后面是版本号,最后面是URL
svn export [-r 版本号] http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
svn export [-r 版本号] svn://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
查看更多关于export命令相关的使用可用下面命令:svn help export
下面是命令的结果,关于使用和各种参数的说明:
usage: 1. export [-r REV] URL[@PEGREV] [PATH]
2. export [-r REV] PATH1[@PEGREV] [PATH2]
3. 从svn版本库中checkout到本地一个工作拷贝,此时你本地磁盘还没有任何一份一样的拷贝
svn co
- svn co http://SVN_PATH/svn_project
- svn co file:///SVN_PATH/svn_project
- svn co -r 12 file:///var/lib/svn/dev/projects # 出第12版的 projcets code
4. 从svn版本库中更新code到本地
svn up
例子:
svn update -----默认将当前目录以及子目录下的所有文件都更新到最新版本。
svn update -r 200 test.php ------(将版本库中的文件test.php还原到版本200)
svn update test.php -----(更新,于版本库同步。如果在提交的时候提示过期的话,
是因为冲突,需要先update,修改文件,然后清除svn resolved,
最后再提交commit)
svn update -r 200 ------从svn版本库中更新指定版本号200的所有文件到本地
5. 文件对比
svn diff
例子:
svn diff test.php ------把test.php与版本库中的文件进行对比
svn diff -r 200:201 test.php ------对版本200和201中的test.php进行对比
6. 将本地的本件添加到svn版本库中
svn add path/filename
例子:
svn add test.php ------(添加test.php)
svn add *.php ------添加当前目录的所有php文件到svn版本库中
说明:上述命令之后,仅仅是作了一个添加的改变信息,你需要再执行svn commit命令来更新
7. 将改动的文件提交到svn版本库中
svn ci [path/filename]
例子:
svn ci test.c ------把test.c文件提交到svn版本库中,此时svn版本库中应该已有之前的test.c
8. 删除文件
svn del [path/filename]
例子:
svn del test.c -------删除test.c文件
说明:上述命令之后,仅仅是作了一个删除的改变信息,你需要再执行svn commit命令来更新
svn del svn://192.168.1.1/pro/test.c ------直接删除svn版本库中的文件,不需要再svn ci
9. 查看svn文件信息
svn info
10. svn帮助文档
svn -h 或 svn help 或 svn add -h (查看svn add命令帮助)
11. 查看日志
svn log [path/filename]
例子:
svn log test.php ------显示这个文件的所有修改记录,及其版本号的变化
12. 查看文件或者目录状态
svn st
例子:
svn status path ------目录下的文件和子目录的状态,正常状态不显示
svn status -v path ------显示文件和子目录状态。第一列保持相同,第二列显示工作版本号,
第三和第四列显示最后一次修改的版本号和修改人。
注:svn st、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn
在本地的.svn中保留了本地版本的原始拷贝。
13. 显示path目录下的所有属于版本库的文件和目录
svn ls path
14. 创建纳入版本控制下的新目录
svn mkdir
例子:
1、mkdir PATH ------每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入
新增调度,以待下一次的提交。
2、mkdir URL ------每个以URL指定的目录,都会透过立即提交于仓库中创建。
在这两个情况下,所有的中间目录都必须事先存在。
15. 加锁/解锁
svn lock / svn unlock filename
16. 恢复本地修改
svn revert
恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。
revert PATH…
注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复被删除的目录
17. 代码库URL变更
svn switch (sw) ------ 更新工作副本至不同的URL
用法: 1、switch URL [PATH]
2、switch –relocate FROM TO [PATH...]
1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将服务器
上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的方法。
2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动(比如
方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用这个命令
更新工作副本与仓库的对应关系。
例子:svn switch --relocate http://59.41.99.254/mytt http://www.mysvn.com/mytt
18. 解决冲突
svn resolved ------移除工作副本的目录或文件的“冲突”状态。
用法: resolved PATH…
注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的相关文件,然后
让 PATH 可以再次提交。
19. 输出指定文件或URL的内容。
svn cat 目标[@版本 ------ 如果指定了版本,将从指定的版本开始查找。
svn cat -r PREV filename > filename
(PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的)
20. 为SVN加入Email通知
可以通过Subversion的Hook脚本的方式为SVN加入邮件列表功能
编译安装了Subversion后 在源码的tools 下有一个comm-email.pl的Perl脚本,在你的
档案目录下有一个hooks目录,进入到hooks目录把post-commit.tmpl 改名为post-commit
并给它可执行的权限。更改post-commit脚本 把comm-email.pl脚本的决对路径加上,
否则 SVN找不到comm-email.pl
REPOS="$1"
REV="$2"
/usr/local/svn/resp/commit-email.pl "$REPOS" "$REV"email@address1.com
email@address2.com email@address3.com
#log-commit.py --repository "$REPOS" --revision "$REV"
最后一行是用来记日志的
21. 建立一個 branch
svn copy http://svnserver/calc/trunkhttp://svnserver/calc/branches/my-calc-branch
-m 'create a branch'
22. 建立 Release Tags
svn copy http://svnserver/calc/trunkhttp://svnserver/calc/tags/Release-1.0.0
-m 'create Release tags for Release 1.0.0'
23. 合并两个版本的档案
svn merge -r REV1:REV2 {path/to/workingcopy}
(UNDO) svn merge -r 1234:1233 ...
(MERGE)svn merge -r 1233:1234 ...
svn merge --dry-run -r 343:344 http://svn.example.com/repos/calc/trunk
24. 有 "C" 状态处理完后, 用 resolved 将自动产生的档案删除, 才能正常 commit:
svn resolved filename
25. svn的switch命令与branch用法 、merge命令用法
svn的switch命令的作用是转变本地工作目录所指向svn的url。
运行switch之后,本地工作目录的文件更新为新的url中的内容,而该工作目录原来所指向的url中的内容在服务器上不会
变化。再次switch,选择原来的url,内容就会回来。
把当前trunk中的版本,branch到一个分支去。我使用的tortoise,在当前的工作目录(trunk)点击右键,点击branch,在
to框中输入要branch的url,点击ok。如果在branch中已经存在该文件,就会失败。这时候应该是做merge。简单点可以
删除branch中相应的文件,然后branch就会成功。这时候在svn服务器上trunck中的文件已经保存了一份到branch了,
然后在本地的branch目录执行update,就可以得到最新的版本了
使用svn的merge命令,把一个版本的变化合并到另一个版本。
我使用的tortoise,在当前的工作目录点击右键,选择merge,在from框输入源url,在revision中输入需要开始merge的版本
起点,比如1400,那就意味着从1400开始后面的变化会merge到工作路径去。
去掉to的checkbox选项,在下面的框子里输入当前工作路径的url, revision选择Head revision, 表示合并到当前最高的版
本上。点dry run 可以看到试运行合并的效果,点merge就合并了。