在版本控制系統的選型上,是選擇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