企業(yè)從Subversion遷移到Git 你準(zhǔn)備好了嗎?

2012-09-07 18:04:14來(lái)源:InfoQ作者:李新

除了人,軟件公司最寶貴的就是代碼了,這些代碼大多儲(chǔ)存在Subversion(以下簡(jiǎn)稱(chēng)”SVN”)這樣開(kāi)源的版本控制系統(tǒng)(VCS)中。代碼是容易修改和變更的,因此,代碼的備份、歷史追蹤、協(xié)同編輯等任務(wù)同樣需要版本控制系統(tǒng)

除了人,軟件公司最寶貴的就是代碼了,這些代碼大多儲(chǔ)存在Subversion(以下簡(jiǎn)稱(chēng)”SVN”)這樣開(kāi)源的版本控制系統(tǒng)(VCS)中。代碼是容易修改和變更的,因此,代碼的備份、歷史追蹤、協(xié)同編輯等任務(wù)同樣需要版本控制系統(tǒng)完成。從最早本地VCS系統(tǒng)RCS、1990年CVS、2000年SVN,到如今開(kāi)源世界風(fēng)頭正健的Git,同語(yǔ)言編輯工具一樣,SVN、Git都是程序員的必備利器。隨著GitHub的流行,很多軟件企業(yè)開(kāi)始計(jì)劃轉(zhuǎn)向Git,但是企業(yè)真的準(zhǔn)備好了嗎?

從SVN到Git,不僅僅是工具的替換,還有基于其上的工具和一些管理流程的變化。筆者建議:軟件企業(yè)需要評(píng)估自己當(dāng)前的狀態(tài)和企業(yè)文化,認(rèn)真考慮商業(yè)目標(biāo),謹(jǐn)慎遷移。我們不妨從以下幾點(diǎn)來(lái)探討一下。

陡峭的學(xué)習(xí)曲線

對(duì)于采用SVN進(jìn)行管理的企業(yè),Git相對(duì)復(fù)雜,開(kāi)發(fā)工程師的學(xué)習(xí)曲線并不平緩。

Git的命令分為高層和底層,常用的高層命令約有30多個(gè),與SVN近似。這些操作不能繼承SVN的經(jīng)驗(yàn),因此工程師需要重新學(xué)習(xí)branch、merge、reset、rebase、revert、pull、fetch等操作命令,需要重新了解哈希值格式的版本號(hào),并用它來(lái)進(jìn)行檢出、比較等。

對(duì)于較多使用word、ppt、excel、圖片、IDE等工具的人員來(lái)說(shuō),從類(lèi)似FTP的SVN轉(zhuǎn)向Git ,學(xué)習(xí)過(guò)程會(huì)比較痛苦。

缺少角色授權(quán)和文件級(jí)訪問(wèn)控制

Git作為開(kāi)源自由原教旨主義項(xiàng)目,它沒(méi)有對(duì)版本庫(kù)的瀏覽和修改做任何的權(quán)限限制。Git的創(chuàng)始人Linus Torvalds 也曾說(shuō):“不要讓權(quán)限成為政治的理由,Git沒(méi)有權(quán)限控制。”

由于缺少角色授權(quán),因此在組織結(jié)構(gòu)管理上比較困難。實(shí)際操作中,一個(gè)Git倉(cāng)庫(kù)用來(lái)實(shí)現(xiàn)一個(gè)項(xiàng)目,大型項(xiàng)目可能需要許多Git倉(cāng)庫(kù)配合實(shí)現(xiàn)。在SVN中不同項(xiàng)目在不同目錄中,通過(guò)角色授權(quán)完成組織結(jié)構(gòu)的規(guī)劃。

實(shí)現(xiàn)商業(yè)目標(biāo)的軟件企業(yè)顯然需要文檔或代碼的訪問(wèn)授權(quán)和控制,目前Git本身是不支持的,需要集成第三方工具實(shí)現(xiàn)訪問(wèn)控制。

有限的目錄檢出功能

SVN是一個(gè)中心倉(cāng)庫(kù)和眾多客戶(hù)端目錄的關(guān)系,因此,SVN用戶(hù)都熟悉工作在某個(gè)目錄上,在不同的工作計(jì)算機(jī)上,檢出目錄就可以編輯。然而,Git是一個(gè)中心倉(cāng)庫(kù)和眾多客戶(hù)端倉(cāng)庫(kù)的關(guān)系,你必須工作在整個(gè)倉(cāng)庫(kù)上,雖然在Git1.7版本后支持了類(lèi)似目錄檢出的功能,但仍要先檢出整個(gè)倉(cāng)庫(kù)。軟件企業(yè)的工程師常同時(shí)在多個(gè)項(xiàng)目中工作,如果修改一點(diǎn)東西就需要克隆倉(cāng)庫(kù),對(duì)故障響應(yīng)將有影響。

浪費(fèi)已投入的開(kāi)發(fā)成本

軟件開(kāi)發(fā)生命周期管理工具的基礎(chǔ)是版本控制系統(tǒng),各商業(yè)軟件開(kāi)發(fā)管理平臺(tái)都是基于自主研發(fā)的版本控制系統(tǒng),在此基礎(chǔ)上擴(kuò)展到項(xiàng)目管理、文檔管理、代碼評(píng)審、發(fā)布部署、缺陷管理等。基于SVN的開(kāi)源或自主研發(fā)的管理工具非常成熟多樣。遷移到Git,則完全浪費(fèi)了投入到SVN管理工具的開(kāi)發(fā)成本。

圖形化工具及接口不夠強(qiáng)

雖然Git的圖形工具正在增多,但在Windows下還需要等待這些開(kāi)源工具增強(qiáng)功能。同時(shí),Git的接口待加強(qiáng),與眾多工具集成待完善,這些都是需要時(shí)間來(lái)解決。

目前很多人倡導(dǎo)的Git的優(yōu)點(diǎn)并非不可替代

Git速度快,但是SVN使用用廉價(jià)的高性能主機(jī)同樣可以提升速度;Git無(wú)需網(wǎng)路也可以工作,但當(dāng)前穩(wěn)固的網(wǎng)絡(luò)基礎(chǔ)環(huán)境和多樣的接入方式,讓SVN并不擔(dān)心網(wǎng)絡(luò)問(wèn)題。另外Git方便地處理分支的特性,如果通過(guò)控制開(kāi)發(fā)節(jié)奏,增加評(píng)審,減少分支數(shù)量,就可以讓分支合并更簡(jiǎn)單快鍵,開(kāi)發(fā)會(huì)更有效率,SVN也可以更好地管理分支。 SVN的1.7版本以不兼容舊版客戶(hù)端的代價(jià)新增和改進(jìn)了很多功能,開(kāi)始向Git靠攏,這也使SVN具備Git的特性。

鑒于以上分享的幾個(gè)基本點(diǎn),建議企業(yè)謹(jǐn)慎遷移。

筆者對(duì)某些場(chǎng)景的命令進(jìn)行了比較,下表是在Git-1.7 和SVN-1.6上測(cè)試的,目的是為了說(shuō)明SVN的操作經(jīng)驗(yàn)在Git上不能直接套用,當(dāng)然Git也有許多獨(dú)特的優(yōu)秀功能。

場(chǎng)景 SVN Git
操作動(dòng)作追蹤 所有的操作均作為一次提交,并分配版本號(hào),可追蹤 可以撤銷(xiāo)某次提交、合并的動(dòng)作,好像沒(méi)有發(fā)生一樣
引用公共庫(kù) 用鏈接目錄實(shí)現(xiàn)
$svn propset svn:externals < module name> < repository_url>
Git 先克隆倉(cāng)庫(kù),再用子模塊方式實(shí)現(xiàn)
$git clone < repository_url> < directory> 
$git submodule add < repository_url>
在本地檢出目錄 用檢出功能實(shí)現(xiàn)
$ svn co < repository_url> < directory>
需要先克隆倉(cāng)庫(kù),激活目錄檢出功能, 通過(guò)配置需要保留的目錄實(shí)現(xiàn)
$git clone < repository_url> < directory>
$cd < directory>
$git config core.sparsecheckout true
$echo < directory> >> .git/info/sparse-checkout
$git read-tree -m -u HEAD
新增文件到中心倉(cāng)庫(kù) 用提交功能實(shí)現(xiàn)
$svn add < file>
$svn commit –m “new file”
提交后,需要推送到中心倉(cāng)庫(kù)
$git add < file>
$git commit –m “new file”
$git push origin

 

關(guān)鍵詞:SubversionGitSVN

贊助商鏈接: