軟體行業有一個關於軟體使用的“28”或是什麼“37”原則的。也不知道是那位老大總結的,但是真的很準確。我們一直用CVS對代碼進行管理,可我想說的是,我一直就使用CVS裡最最基本的部分。cvs co,cvs ci, cvs up,cvs add,都是最基本的功能,我從來就沒有過仔細的研究一下CVS,慚愧!
我參與的項目release好一段時間了,這期間經曆了市場血與火的洗禮...。做應用軟體的就是這樣,你一定會碰到不同使用者的不同需求,你需要為其定製開發。好,當有A省的使用者有特殊的需求的時候,我們就用CVS為其建立一個新的project。同理,當有B省使用者有特殊的需求的時候,我們還是採用同樣的辦法。我們一開始沒有覺得這樣哪裡不好,為不同的使用者建立不同的project,很清晰,維護起來還挺方便。就像《後天》裡的情節哪樣,你總是要對你不正確的做法付出慘痛的代價。我們很快發現了我們的做法的致命傷,當我們需要修改一個bug,或者是升級程式,加入通用的功能的時候,我們需要手工同步很多版本。god,大量的重複勞動!我清楚的聽到我鄰座那個可愛的女孩的抱怨:真麻煩,要同步這麼多版本。
有的時候,我覺得自己很幸運^_^。當有一個問題困擾著我的時候,我準備上一個常去的論壇向guru請教的時候,發現大家正在那裡熱火朝天的討論著這個問題。這次也差不多,一天晚上和一個以前的同事聊了一些關於版本管理的問題。那個同事現在在一家外企工作,據稱他們的版本管理很規範,有很專業的專門人員來做這件事情。他告訴我,應該可以採用CVS的分支功能來解決這個問題。雖然我當時雲裡霧裡,不太明白,他也不是做版本管理的,但是,重要的是這個idea。我是一個聽人勸的人,馬上從一個同事那裡揩來《CVS-開源軟體開發技術》那本書。仔細的研究了一下分支的功能。嘖嘖,這就是我想要的,哈哈,在屋裡跳了一會小天鵝。嗯,程式員總是這樣大喜大悲的!
把我的輕騎兵音箱調到很大聲,聽著《癡心絕對》。我喜歡這樣寫文章^_^。好吧,讓我們看看什麼是CVS的分支。
我們把一個項目的一個主要開發過程稱作開發主線。當某一個特殊事件發生的時候,例如,有一個使用者有特殊的需求,於是就從這個開發主線裡分離出來一個叉,以滿足使用者特殊的需求,那麼這個叉有它自己的發展方向,這就是分支,就像是一個大樹在春暖花開的時候,長出來的新枝。
---------分支
/
/
/
------●----------------------------開發主線
上面這個點,代表開發主線的最新版本,那麼這個時候可以從開發主線建立分支來進行定製開發。接下來,開發主線和分支就可以有各種的發展方向。而且,如果可以的話,分支的代碼可以重新合并到開發主線中。開發主線的代碼也可以更新到分支代碼中。
假設在我們的home目錄下的proj目錄就是我們的工程。下面具體看一下,如何建立分支:
1、先在開發主線上建立一個標籤,就是中那個點。這樣做是為了以後可能有使主乾重新回到分支建立時的狀態的需求。在你的工程目錄的top level下執行cvs tag Root-of-Version_2.5.0.0。
2、建立分支:cvs tag -b ln_version_branch(-b選項就是建立分支)。
3、接下來,你可以在工程目錄的top level下直接執行cvs update -r ln_version_branch轉到分支上進行工作。也可以通過cvs co -r ln_version_branch -d ln_proj proj命令新checkout一份分支的本地拷貝。-d選項是建立本地目錄名字。這裡建議用第二種用法,因為在一個本地拷貝下通過命令來回在主線和分支轉換,容易產生混淆,你也可能忘記這麼去做。
4、這樣分支的開發和主線的開發就可以分離開。如果需要的話,可以把分支上的代碼合并到開發主線上,當然在合并的過程中可能需要解決一些衝突。cvs update -j ln_version_branch,通過這樣的命令把分支代碼合并到主線上。當然我們這裡的例子是針對使用者特殊需求產生的分支,一般不會把分支合并到開發主線中。但是,對於bug修改等產生的分支,就會有需求把分支合并到主線上。這裡有一點要強調的是,當開發主線的程式員合并分支的代碼的時候,需要互相溝通。在開發主線程式員成功合并分支代碼後,在主線代碼上要設立一個點(cvs tag)來標誌這次合并;在分支代碼上開發的程式員,在合并之後,也要建立一個點來標誌這次合并,例如,cvs tag ln_version_1。這樣做的好處是當下次在進行代碼合并的時候,在開發主線上的程式員可以通過命令cvs update -j ln_version_1 -j ln_version_branch,這裡ln_version_branch代表分支的末梢,因此該命令不是重新合并整個分支代碼,而是合并自從合并點ln_version_1到現在修改的代碼,這樣可以防止重新合并整個分支而帶來的衝突。
5、對於我們這裡針對使用者特殊需求產生的分支,可能更多需要的是把開發主線上的代碼更新到分支上。cvs update -j HEAD,這裡HEAD代表了主乾的末梢,也就是這個命令合并了主線在建立該分支伊始到目前為止,所有的主線上修改的代碼。這裡還是需要分支開發人員和主線開發人員溝通。在分支上也需要設立一個點來標誌這次合并,這樣如果主線需要合并分支代碼的時候,可以根據這個點進行新的合并,而不是合并整個分支。主線開發人員也需要設定點來標誌這次合并,例如,cvs tage merged-ln_version_1 ,這樣下次分支在合并主線代碼的時候可以cvs update -j merged-ln_version_1 -j HEAD ,這樣防止了分支重複合并主線上的代碼,而只是合并最新的修改。
上面我們可以看到,一個主要規則是,當進行代碼合并的時候,一定要注意溝通,合理的設定合并點。並且,合并點的名字也應該望文生義^_^。各個線上的合并工作也最好由一個人來做。如果合并點設定不當,那麼分支帶來的好處可能就會打折扣。並且如果管理的不好,整個項目可能會很亂,產生意大利麵條式的分支^_^。
上面,我大概描述了一些CVS中的分支功能,我表達能力有限,可能表達的不是很清楚,還望大家見涼。如果感興趣,可以詳細參考一下各個方面資料。但重要的是idea嗎,對吧,我這裡仍了一塊石子^_^。我想直到今天,我才把CVS這把長劍拔了出來,但只是拔了出來,要想使出獨孤九劍,還需要苦練心法才行...。
選擇自 zhanghx6986 的 Blog