现在虽然Git大行其道,但是也在所难免会有使用SVN的场景(比如我原来在华为的部门用的就是SVN),毕竟相比于Git,SVN使用起来还是简单很多,而且Git更适合于开源模式的写作。好吧,工具无绝对的优劣,不比较了,没什么意义。本文主要推荐一个我认为在Mac下还比较优雅的SVN解决方案。当然,如果你的开发工具是诸如Eclipse、IDEA等高级IDE的话,一般这种IDE集成的版本管理工具就足够用了,你也没有太大必要再继续往下看了...

相信很多Mac用户会发现,在Mac上Git的客户端还挺多,比如SourceTree就是一个非常棒的而且免费的Git客户端,但是SVN却没有什么比较像样的客户端,免费的里面就不用谈了。不过,我前段时间发现一个比较好的解决方案就是:SVN命令行+SnailSVNLite

PS:如果你习惯图形化的工具,那可以不用看SVN命令行这一节,直接看SnailSVNLite

SVN命令行

使用Git的人里面有相当一部分的人平时都使用的是命令行,相比于Git,SVN更加简单,所以其实平时用命令行足矣,而且Mac默认已经安装了SVN命令。输入svn help我们可以看到,其命令总共不到四十个,而常用的估计也就个位数,反正我平时基本只用四五个。特别是当你的终端支持自动补全的时候(比如Mac下常用的组合iTerm+zsh+oh my zsh),那么这个命令行使用起来就灰常的简单了。对于极致的Geek来说,这就够了。如果你像我一样,还喜欢像TortoiseSVN那种工具一样,可以在文件上面用不同的图标来显示状态,那么可以接着往下看。

SnailSVNLite

虽然SnailSVN是收费的,但是SnailSVNLite却是免费的,而且它可以像Windows下的TortoiseSVN工具一样在Finder里面用不同的图标显示文件的状态,其安装很简单,从App Store下载安装即可,装完后的样子如下(可能需要重启,而且需要进行一些简单的系统设置,以使其继承到Finder里面,软件自身会提示,而且网上有很多教程,这里就不重复造轮子了):

SnailSVNLite.png

可以看到后边有绿色的图标,而且Finder上面也继承了一些成员的命令,而且右键菜单也会多出一些svn的命令。

当然,SnailSVNLite本身就提供了一个完整的SVN客户端的命令,我为什么还要先介绍命令行呢?因为我使用的时候发现全部用这个工具操作时,有的时候它会crash掉,特别是一次提交的文件稍微多一点的时候。也许是我使用的姿势有问题,如果你不喜欢用命令行,那你可以直接只安装SnailSVNLite试试。

SVN命令行调用Beyond Compare

svn自带的diff和merge工具我觉得看少量的代码变动还行,要是变动比较多我感觉要疯掉(当然一些大神们貌似很喜欢这种格式)。开源的diff工具很多,但目前为止我最喜欢的还是非beyond compare莫属。这里讲一下如何将svn命令行默认的diff工具改为beyond compare(GUI的Git或SVN工具一般在设置里面选择Beyond Compare就行,很容易),当然该方法参考自网上。

首先在~/.subversion目录下创建两个脚本:

bc2.sh:

#!/bin/sh

# Configure your favorite diff program here.
DIFF="/usr/local/bin/bcompare"
# DIFF="/usr/bin/meld"
# DIFF="/usr/bin/kompare"
# DIFF=env LANG=zh_CN.UTF-8 WINEPREFIX="/home/borqs/.wine" wine "C:\\Program Files\\Beyond Compare 2\\BC2.exe"

# Subversion provides the paths we need as the sixth and seventh
# parameters.
LEFT=${6}
RIGHT=${7}

# Call the diff command (change the following line to make sense for
# your merge program).
$DIFF $LEFT $RIGHT

# Return an errorcode of 0 if no differences were detected, 1 if some were.
# Any other errorcode will be treated as fatal.
#return 0

bc3.sh:

#!/bin/sh

# Configure your favorite diff3/merge program here.
DIFF3=bcompare
# Subversion provides the paths we need as the ninth, tenth, and eleventh
# parameters.
MINE=${9}
OLDER=${10}
YOURS=${11}

# Call the merge command (change the following line to make sense for
# your merge program).
$DIFF3 --older $OLDER --mine $MINE --yours $YOURS

# After performing the merge, this script needs to print the contents
# of the merged file to stdout.  Do that in whatever way you see fit.
# Return an errorcode of 0 on successful merge, 1 if unresolved conflicts
# remain in the result.  Any other errorcode will be treated as fatal.

然后编辑~/.subversion/config文件:

... ...
diff-cmd = /Users/username/.subversion/bc2.sh
... ...
diff3-cmd = /Users/username/.subversion/bc3.sh

如果你没改过的话,上面的两行默认是注释掉的,你去掉注释,并改为上面的样子,注意将其中的username改为你自己的家目录名。

注意点

  1. 可以看到上面的脚本中DIFFDIFF3两个变量都表示的是Beyond Compare的路径,我一个写的是绝对路径,一个只写了命令名。其实都可以,如果只写命令名,那务必保证命令所在路径在你的PATH里面。
  2. Beyond Compare装完后,默认并没有安装命令行,需要点击"Beyond Compare->Install Command Line Tools...",这样就会在/usr/local/bin目录安装bcomparebcomp命令了。

OK,分享完毕,祝使用愉快。