DVCS的折腾
最近折腾了一下分布式的版本管理系统,几天下来,感叹人生在于折腾。
现在风头最劲的DVCS非Mercurial和Git莫属了,因为我主要在Windows下使用,而Mercurial跨平台支持不错,所以先试下。
下载了TortoiseHg 1.0+Mercurial 1.5,准备把原来的svn库转换过来。svn到Mercurial的转换有多种方法:
- hg自带convert插件,安装Subversion Python Binding,再配置一下Mercurial.ini就可以使用了。转换速度挺快,但是转出来的库取中文文件名时出错。
- 另外一个插件hgsubversion,情况跟convert插件类似。
- hgsvn,直接调用svn.exe,速度慢,但转出来中文文件名可用。(有两个bug,一个是显示时乱码,另一个是转换某些中文文件出错,小改后可用)
Git的转换也有类似的中文文件名无法处理的情况出现,怀疑是跨平台支持的问题。所以找回wubi装上了ubuntu,在Linux下试一把。然后又是一通安装,把python-dev、svn、mercurial、git、xxx binding……装备搞齐,一转换,还真行,中文完全没有问题,心中窃喜。回到Windows,再试,又不行了,囧。
仔细搜搜文章,发现Mercurial和Git在文件名处理上都有相同的问题。跟Linux系统类似,处理文件名不考虑编码,OS给什么,就存什么。Linux都是UTF8,所以没有问题。Windows下把UTF8文件名取出来,Windows可不认识,所以还是出错了。
于是再进一步捣鼓,发现Bazaar(简称bzr)在多语言文件名上处理的很好。bzr虽然不如Mercurial和Git使用广泛,但也不错,曾几何时还倒腾过几下的。bzr速度比Mercurial和Git慢一些,虽然2.0已经有了很大改观,我忍了。
bzr玩得正欢,忽然发现了FixUtf8,Mercurial的一个插件,号称可以解决Windows下Unicode文件名处理的问题,狂喜。换回Mercurial,可以正常使用,Python扩展性就是好哇。除了在convert时要把此插件禁用,问题不大。
本以为折腾到此为止,没想到一波未平,一波又起。又发现Mercurial在处理一个大文件时out of memory,真是shit。找到官方wiki有篇文章说明,不支持太大的文件。可是这个文件才300M呀,sign。相同的问题也出现在bzr上,真是欲哭无泪,杯具啊。
Git,我的神,入了一个4G的文件都没问题,6G的文件就出错了。看来还是Linus靠谱!但是msysgit(Windows下的Git)对中文文件名支持始终有问题,无论如何设置也不能成功,TortoiseGit也一样。
神哪,我只是想要一个在Windows平台下可以用的、有GUI的、支持Unicode文件名、可以入大点的文件的DVCS,咋就这么难捏?
最后附上我对这几个DVCS的比较:
Git。Linus自己开发的。
优点:
* 速度最快。
* 使用最广泛,被多个大项目使用。
* 支持更大的文件,测试4G的可以,6G的不行。
缺点:
* 跨平台支持不够好。Windows平台支持依赖第三方项目msysgit和TortoiseGit。
* 不容易理解。
* Windows下不支持多语言文件名。
* 需要日常维护git gc。
Bazaar。基于Python开发。
优点:
* 支持多语言文件名(包括TortoiseBzr)。
* 跨平台支持很好。
* 被ubuntu选中。
* 支持类似svn的工作流程,以及更多的工作流程。
缺点:
* 比Mercurial和Git慢。虽然1.0之前采用knits格式(类似Mercurial的revlog),1.0之后采用pack格式(类似Git),2.0性能大幅提升,但性能从未超越……
* repository比较大,我自己的代码库Bazaar 28.3M,Mercurial 11.8M,Git 10.1M。这个也是从未超越……
* 使用群体不够广。
* 需要日常维护bzr pack。
* 不支持在一个库中使用branch。
* 不能处理过大的文件,反正300M的不行。
Mercurial。基于Python开发。
优点:
* 文档完善。
* 被OpenSolaris、Mozilla选中。
* 容易理解,方便使用(有TortoiseHg项目)。
* 速度快,但还比不上Git。
* 不需要git gc/bzr pack之类的日常维护。
缺点:
* Windows不支持多语言文件名,但可以通过fixutf8插件解决。
* 底层储存使用了很多文件,Windows平台下对性能有负面影响。
* 不支持local branch,但可以通过bookmarks插件支持。
* 不能处理过大的文件,反正300M的不行,参见http://mercurial.selenic.com/wiki/HandlingLargeFiles。