svn对于使用惯了git的人来说可能有点别扭,主要是因为功能的缺失,但它毕竟也曾经称霸vcs市场,还是有两把刷子的。
下面主要总结一下它的主要使用场景。假定现在已经存在trunk。
svn info

注意其中的Relative URL,^表示相对路径的起点,这里在trunk目录下, 所以是^/trunk,相应的,如果是在别的branch下,就是^/branches/happyhacker这种了。
svn co(checkout)
这个类似于git的git clone,就是从中心仓库把代码拉取一份到本地,可以将本地目录作为第二个参数,用于指定代码的存放路径。
svn up(update)
这个类似于git的git pull,把远程代码的修改同步到本地。
svn sw(switch)
这个类似于git的git checkout,在本地工作副本中切换分支。

svn log
用于查看日志,可以用-l选项指定要查看最近的多少条提交日志。可以用--search搜索相关关键词。
例如从最近的50条提交日志中查询happyhacker提交的记录。

需要注意的是这里的-l指的是从50条里面查找,50指的是输入,而不是输出。
svn st(status)
这个类似于git的git status,查看当前目录下的文件变化。

svn add
这个类似于git的git add,不同的是一个文件只需要svn add一次即可,后面的每次修改默认情况下都会被提交。

svn ci(commit)
这个类似于git的git commit && git push,注意这里比git少了git add操作,因为svn没有本地stage的概念,所以执行svn ci其实就是把代码推送到了中心仓库。

svn merge
注意:这个类似于git的git rebase而不是git merge。因为svn的提交日志永远是线性的,而不是像git那样用git merge可以产生分叉的提交记录。这也是在使用git svn时不可以用git merge的原因。

这是一个典型的出现了冲突(conflict)的场景,需要认为干预解决冲突。这里选择(e)。

可以看出,working指的是当前的工作副本,r7指的是该文件在中心仓库中的版本,而r16则是该文件在^/branches/happyhacker分支中的版本。
这里可以编辑它,解决冲突,正常退出,然后在后面出现的交互界面选择(r)标记为已解决。

或者在开始选择(p)后面再解决也可以。只不过没有了交互式的命令,需要自己使用svn resolve来将文件标记为已解决。
svn cp(copy)
用于在中央仓库创建分支。注意,这个操作是远程操作,完成之后会直接对中央仓库进行修改。另外,svn的标准目录结构是

所以比如要基于^/trunk创建新分支,命令应该是这样的:

然后会弹出填写commit message的界面,填写之后会发现它会提交一条记录:

这也证明了这是一条远程操作命令,会对中央仓库作出修改。

svn diff
基本上会了以上命令,就可以在svn的环境下生存下来了。但默认的diff工具太难用,可以用现成的vimdiff。
-
编写vimdiff的wrapper,并为之赋予写权限
#!/bin/bash /usr/local/bin/vimdiff ${6} ${7} -
在svn里配置使之成为diff工具

注意是配置在[helpers]段下。
这时再执行
svn diff就会打开vimdiff了。
有了上面这些命令加持,基本上就可以在svn的世界里生存了。