svn环境生存指南

178 阅读3分钟

svn对于使用惯了git的人来说可能有点别扭,主要是因为功能的缺失,但它毕竟也曾经称霸vcs市场,还是有两把刷子的。

下面主要总结一下它的主要使用场景。假定现在已经存在trunk。

svn info

image-20180816203532882

注意其中的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,在本地工作副本中切换分支。

image-20180816204241731

svn log

用于查看日志,可以用-l选项指定要查看最近的多少条提交日志。可以用--search搜索相关关键词。

例如从最近的50条提交日志中查询happyhacker提交的记录。

image-20180816204502054

需要注意的是这里的-l指的是从50条里面查找,50指的是输入,而不是输出。

svn st(status)

这个类似于git的git status,查看当前目录下的文件变化。

image-20180816204939055

svn add

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

image-20180816205147695

svn ci(commit)

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

image-20180816205356126

svn merge

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

image-20180816205509806

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

image-20180816205641691

可以看出,working指的是当前的工作副本,r7指的是该文件在中心仓库中的版本,而r16则是该文件在^/branches/happyhacker分支中的版本。

这里可以编辑它,解决冲突,正常退出,然后在后面出现的交互界面选择(r)标记为已解决。

image-20180816210027847

或者在开始选择(p)后面再解决也可以。只不过没有了交互式的命令,需要自己使用svn resolve来将文件标记为已解决。

svn cp(copy)

用于在中央仓库创建分支。注意,这个操作是远程操作,完成之后会直接对中央仓库进行修改。另外,svn的标准目录结构是

image-20180816210319711

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

image-20180816210449749

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

image-20180816210550789

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

image-20180816210639235

svn diff

基本上会了以上命令,就可以在svn的环境下生存下来了。但默认的diff工具太难用,可以用现成的vimdiff。

  1. 编写vimdiff的wrapper,并为之赋予写权限

    #!/bin/bash
    
    /usr/local/bin/vimdiff ${6} ${7}
    
  2. 在svn里配置使之成为diff工具

    image-20180816211021118

    注意是配置在[helpers]段下。

    这时再执行svn diff就会打开vimdiff了。

有了上面这些命令加持,基本上就可以在svn的世界里生存了。