一直在用subversion做版本控制,一直用得很happy。后來聽說了Git,一個(gè)分布式版本控制系統(tǒng),但是一直沒有細(xì)細(xì)研究,因?yàn)槲艺J(rèn)為subversion夠用了。今天看了看ubuntu的開發(fā)頁面,它們?cè)谟靡粋€(gè)叫Bazaar的分布式版本控制系統(tǒng),于是出于對(duì)ubuntu的信任,愛屋及烏,想看看ubuntu選擇的版本控制系統(tǒng)有何獨(dú)到之處,看介紹的時(shí)候其實(shí)并沒有看進(jìn)去,但實(shí)然間想通了為什么要用分布式版本控制系統(tǒng),并且要在自已的日常開發(fā)中使用它。
  首先來看看用subversion過程中遇到的一些鬧心的事情:
  一,我做為管理員(項(xiàng)目由我創(chuàng)建,我要負(fù)責(zé)提交的代碼的檢閱確保代碼隨時(shí)能夠編譯并進(jìn)行新版本發(fā)布)時(shí)遇到的問題:
   *某個(gè)組員對(duì)subversion的使用一知并解,比較粗心,他會(huì):提交一些不必要的文件內(nèi)容(編輯器產(chǎn)生的臨時(shí)文件、備份文件,對(duì)發(fā)布時(shí)所需的程序配置文件的一些本地修改,甚至用于成員間的臨時(shí)文件傳送),他會(huì)不寫提交時(shí)的注釋或很隨便。做為一個(gè)開發(fā)組你無法阻止他們提交,即使技術(shù)上可行你也不可以或者說是無權(quán)這么做,相對(duì)于我這個(gè)管理員所需付出的額外維護(hù)精力,對(duì)開發(fā)組成員和積極性的傷害才是致命的。結(jié)果顯而異見,做為管理員的我基本上每天都要修復(fù)提交的代碼中的問題,并通知各個(gè)成員立即更新工作拷貝,并對(duì)犯事者進(jìn)行又一次教育,svn不是這么用的。終于有一天svn倉庫所占用的空間占光了分區(qū)空間,于是重建倉庫,項(xiàng)目的歷史沒有了,程序開發(fā)中記錄的一些真知灼見和經(jīng)驗(yàn)教訓(xùn)也找不到了,程序舊版本的bug也因?yàn)闄z不出當(dāng)時(shí)的源代碼而未了未之。
  二,我做為組員時(shí)遇到的問題:
  版本控制就像是一付后悔藥,一個(gè)月光寶盒,可以撤消/重做是多么愜意啊,還記得洗完澡后將干凈衣服扔進(jìn)桶里時(shí)的抓狂嗎,反正這種情形下我是到處在找CTRL+Z鍵。毫無顧慮地使用版本控制讓開發(fā)的日子更輕松,也更自信,可以大膽地嘗試各種思路,不用擔(dān)心自已偶然間天才的代碼或者是想法在某個(gè)煩燥的中午被刪掉。但是subversion也不是能夠想用就用的,為什么呢:
  通常來說,提交的東西一定是好的、完整的,它不會(huì)讓整個(gè)項(xiàng)目處于一種不可用的狀態(tài)(聽說在某些公司,如果你捅了這個(gè)簍子,晚上你就得搬個(gè)席子半夜在機(jī)房里守著項(xiàng)目自動(dòng)編譯過程,直到遇到下一個(gè)像你一樣的倒霉蛋),問題是在你搞定這個(gè)好的、完整的提交部分的過程中,你得不到subversion的庇佑,你的月光寶盒被紫霞給搶走了,你得小心地按delete鍵,你不敢刪除代碼中不潔的代碼,如果你像我一樣用慣了svn的話,在這段時(shí)間里你一定沒有安全感。我真的需要自已的私有的版本控制,怎么辦?svn給的標(biāo)準(zhǔn)答案是:1,創(chuàng)建分枝,可以解決問題,問題是必須提交代碼到中心服務(wù)器,會(huì)占用服務(wù)器的資源(主要是硬盤空間),網(wǎng)絡(luò)不可達(dá)時(shí)就不管用了,這很常見,如:公司比較小,svn倉庫搞不好就在頭兒的筆記本上,萬一頭兒不在就用不了了;你在家里做開發(fā)也可能暫時(shí)用不了;另外,你的私有版本可能有點(diǎn)不能見光,比如:你僅僅是想嘗試一下新技術(shù),你想搞個(gè)個(gè)人版,你不服氣原有的設(shè)計(jì)想弄出個(gè)加強(qiáng)版過幾天放出后一鳴驚人。2,在本地上建個(gè)倉庫,導(dǎo)入原項(xiàng)目的內(nèi)容,不過問題就更嚴(yán)重了,和原項(xiàng)目同步不容易。
  而分布式版本控制系統(tǒng)則從根本上解決了上述問題,估且認(rèn)為它和分枝是在本地上的Subversion吧,你可以方便地從源分枝創(chuàng)建自已的分枝,它有單獨(dú)的歷史,不依賴于某個(gè)中心服務(wù)器,在必要時(shí)你可以從某個(gè)外部分枝上更新內(nèi)容,提交自已對(duì)源分枝的修改,發(fā)布自已的分枝以便別人在此基礎(chǔ)上創(chuàng)建新的分枝。是的,這個(gè)時(shí)候?yàn)榱俗屪x者能夠打心眼里認(rèn)同我對(duì)分布式版本控制系統(tǒng)的推崇,我得惡補(bǔ)一下分布式版本控制系統(tǒng)的知識(shí),至少得裝出有過那么幾年分布式版本控制系統(tǒng)的使用經(jīng)驗(yàn),最后來句“其實(shí)我也是經(jīng)過了數(shù)十年的努力才取得了今天的成就”做為文章的結(jié)尾,閑話說多了,總結(jié)一下:Subversion解決了CVS的一些問題,DCVS解決了Subversion的一些問題,這只是版本控制的又一次發(fā)展,況且只要你愿意,DCVS也可以傳統(tǒng)的集中式服務(wù)器模式運(yùn)行,有理由相信DCVS會(huì)是對(duì)Subversion的一次完勝。
最后,做為一名寫下本文章的DCVS菜鳥,當(dāng)然免不了要推薦一些閱讀資料:
分布式版本控制系統(tǒng)入門:http://www.ibm.com/developerworks/cn/aix/library/au-dist_ver_control/