SVN 命令速查与日常操作
SVN 命令速查与日常操作
这篇把我平时用 SVN 时常翻的几块凑在一起:命令行常用操作、分支的拷贝/删除、忽略文件的设置、Shelf(搁置)以及 TortoiseSVN 装好后怎么把命令行客户端补上。仓库 URL 统一写成 http://<svn-server>/svn/myproject/trunk 这种占位形式,换成自己的地址即可。
常用命令
获取本地工作副本的 revision 号:
svn info --show-item revision
获取两个版本之间的日志记录:
svn log -r %LAST_SVN_REVISION%:%SVN_REVISION% http://<svn-server>/svn/myproject/trunk/ns/ > svn_list.txt
用 diff 拿两个版本之间的改动清单(XML 摘要形式,方便后续脚本处理):
svn diff --revision ${LAST_SVN_REVISION}:${SVN_REVISION} --xml --summarize http://<svn-server>/svn/myproject/trunk/ns/data > ${WORKSPACE}\ns\diff.xml
把 SVN log 转成 HTML 表格
我在 CI 里需要把上面那份 svn_list.txt 变成网页里能直接贴的表格行,用 sed 一步步替换。思路是:删空行 → 在文件首尾补上 <tr><td> / </td></tr> → 把分隔行 ---... 换成换行的表格行、把 | 换成单元格分隔 → 把日期尾巴 +0800... 之后的内容截掉 → 最后把所有换行符连成一行。
@echo off
rem 删掉所有空行
sed -i -e "/^[[:space:]]*$/d" svn_list.txt
:: 文件开头加 <tr><td>,结尾加 </td></tr>
sed -i -e "1c\<tr><td>" -e "$c\</td></tr>" svn_list.txt
:: 把 ---.* 换成 </td></tr><tr><td>,把 | 换成 </td><td>
sed -i -e "s/^---.*/<\/td><\/tr><tr><td>/" -e "s/|/<\/td><td>/g" svn_list.txt
:: 把 +0800.* 换成 </td><td>
sed -i "s/+0800.*/<\/td><td>/g" svn_list.txt
:: 删掉所有换行符
sed -i -e ': label;N;s/\r\n//g;b label' svn_list.txt
sed -i -e ': label;N;s/\n//g;b label' svn_list.txt
分支:拷贝与删除
SVN 的分支靠的是一套非常轻量的拷贝机制,开销极小。分支和打标签本质是一回事:用 svn copy 把仓库里的一个目录整个复制到仓库里的另一个位置。复制出来的目录是 backup、tag、branch 还是别的,纯粹是约定,取决于团队习惯(通常受你以前用过哪个 SCM 工具影响)。
常见的目录结构是在仓库顶层放 trunk、branches、tags 几个目录,把 trunk(或其子集)拷进 branches / tags。多项目时可以在每个项目下各复制一套这种结构。
这套概念需要点时间适应,但确实管用——关键是你和团队对约定要清楚。命名也最好有规范,能从名字看出这个分支/标签因何而建、是否还有效,并想好怎么归档过期分支。
创建一个候选分支(基于 r3212):
svn copy -r3212 http://<svn-server>/svn/myproject/trunk http://<svn-server>/svn/myproject/candidate -m "Creating a candidate branch with R3212"
删除分支:
svn delete http://<svn-server>/svn/myproject/candidate -m "Deleting candidate branch"
设置忽略文件(TortoiseSVN)
步骤:
- 安装 TortoiseSVN(安装包从内网工具目录获取,例如
\\<nas>\tools\TortoiseSVN-1.10.x-x64.msi)。 - 准备一个忽略规则文件(文件名随意),按 TortoiseSVN 的全局忽略配置把规则填进去。
- 配好之后再执行 svn commit,被忽略的文件就不会出现在提交列表里。
两个容易踩的坑:
- 如果你用 TortoiseSVN 的 add 功能手动把某个文件加进了暂存区,忽略规则会被跳过,这个文件照样会被提交。
- 暂存区状态混乱时,用 clean up。
Clean up 各选项的含义
| 选项 | 作用 |
|---|---|
| Clean up working copy status(清理工作副本状态) | 把不一致的工作副本恢复到可用状态。不影响数据,只动工作副本数据库的内部状态。这就是旧版本客户端里那个 清理 命令。 |
| Break write locks(解开写入锁定) | 删除工作副本数据库里所有写入锁定。大多数情况下清理都需要这一项。只有别的用户/客户端同时在用这个工作副本时才取消勾选;但如果清理失败了,还是得勾上才能成功。 |
| Fix time stamps(修复时间戳) | 调整所有文件的记录时间戳,加快后续状态检查,让提交对话框之类显示文件列表的界面更快。 |
| Vacuum pristine copies(清理原始副本) | 删除未使用的原始拷贝,压缩剩余的原始拷贝。 |
| Refresh shell overlays(刷新图标覆盖层) | 图标覆盖(尤其是资源管理器左侧树里的)有时不显示当前状态,用这个强制刷新。 |
| Include externals(包含外部文件) | 让上述操作也作用于带 svn:externals 属性的文件和文件夹。 |
| Delete unversioned files and folders | 删除未纳入版本控制的文件和文件夹(移到回收站)。 |
| Delete ignored files and folders | 删除被忽略的文件和文件夹。配合上一项是快速清掉工作副本里所有生成文件的简便办法。同样的事也能在 TortoiseSVN → Revert 对话框里做。 |
| Revert all changes recursively(递归恢复所有更改) | 恢复本地所有未提交的修改。更推荐用 TortoiseSVN → Revert,那里能先看清并挑选要恢复的文件。 |
Shelf(搁置,1.14)
Subversion 1.14.x 把若干功能标为 EXPERIMENTAL(实验性),Shelf 就是其中之一。早期放出来是为了测试、收集反馈、吸引人参与开发。
实验性功能/API 被视为不完整,在 1.14.x 系列期间乃至之后都可能大改,连点版本之间都不保证向后兼容。另外 1.14 的 shelf 与 1.10 创建的 shelf 不兼容,1.10 的旧 shelf 需要按官方说明在工作副本里恢复。
可用的 shelving 命令(具体看各自 help):svn x-shelf-diff、x-shelf-drop、x-shelf-list / x-shelves、x-shelf-list-by-paths、x-shelf-log、x-shelf-save、x-shelve、x-unshelve。
主要命令相对 1.10 的变化:
| Subversion 1.10 命令 | Subversion 1.14 等价写法 |
|---|---|
svn [x-]shelve [--keep-local] SHELF [PATH...] | 用法类似;每次使用都会保存一个新版本 |
svn [x-]unshelve [SHELF] | svn x-unshelve --drop [SHELF] |
svn [x-]unshelve --keep-shelved [SHELF] | svn x-unshelve [SHELF] |
svn [x-]shelve --delete SHELF | svn x-shelf-drop SHELF |
svn [x-]shelves 或 svn [x-]shelve --list | svn x-shelves 或 svn x-shelf-list |
参考:Subversion 1.14 shelving release notes。
补上命令行客户端
装完 TortoiseSVN 后如果命令行报 'svn' is not recognized as an internal or external command.,说明只装了 GUI 没装命令行客户端。重新运行 TortoiseSVN 安装程序,在功能选择里勾上 command line client tools,装好后把它的安装路径加到系统 PATH(默认在 TortoiseSVN 安装目录的 bin 下),重开终端即可使用 svn。