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的世界里生存了。