在版本控制系统的选型上,是选择Git还是SVN?
对于开源项目来说这不算问题。使用Git极大地提高了开发效率、扩大了开源项目的参与度、 增强了版本控制系统的安全性,选择Git早已是大势所趋。
但对于企业用户来说这个决心不太好下。部分原因是出于对Git的误解,部分原因是尚不了解 Git到底能给项目管理带来什么好处。希望本文能对您项目的版本控制系统选型提供帮助。
对SVN的迷信和对Git的误解
误解1:SVN只能检出(checkout)一个版本(revision)的代码,而Git却可以脱库!
这个误解是如此普遍,简直成了SVN在企业市场中封杀Git的尚方宝剑。其实稍微思考一下 这个谣言很难传播。既然SVN能够读取授权访问的文件的每一个版本,那么能够重组这些版本, 进而实现对版本库的完整复制。即SVN也可以脱库。
SVN脱库的工具SVN本身提供: svnsync 。这个工具主要用于SVN的版本库镜像。 例如将版本库http://host.name/svn/repo 脱库到本地的 dump 目录,命令如下:
$ svnadmin create dump
$ printf '#!/bin/sh
exit 0
' > dump/hooks/pre-revprop-change
$ chmod a+x dump/hooks/pre-revprop-change
$ svnsync init file://$(pwd)/dump http://host.name/svn/repo
$ svnsync sync file://$(pwd)/dump
如果使用 git-svn 则为SVN“脱库”更简便。
$ git svn clone -s http://host.name/svn/repo dump
有人认为SVN可以对目录授权,从而阻止对整个版本库进行脱库操作。 下面来看看SVN的授权究竟是否可靠。
误解2:SVN能对目录进行精细授权,而Git太不安全
SVN的目录授权对管理员来说是灾难,管理负担相当重,在分支或里程碑众多的时候很难作对。 这是因为SVN的分支和里程碑(tags)本身是一个目录(使用目录拷贝实现的)。
例如管理员为名为demo的SVN版本库授权。一个并不太复杂的主线(/trunk)授权如下:
[demo:/trunk]
@demo-admin = rw
@leaders = r
[demo:/trunk/doc]
@demo-dev = rw
@designers = rw
[demo:/trunk/src/apps]
@demo-dev = rw
[demo:/trunk/src/common]
@demo-dev = rw
[demo:/trunk/src/html]
@designers = rw
[demo:/trunk/src/secret]
* =
@demo-admin = rw
jiangxin = rw