【18】創(chuàng)建分支
在企業(yè)級(jí)產(chǎn)品的開(kāi)發(fā)過(guò)程中,除了通用產(chǎn)品之外,有時(shí)會(huì)存在一些需要根據(jù)客戶(hù)實(shí)際情況進(jìn)行“定制化”的情況。假設(shè)現(xiàn)在我們產(chǎn)品的代碼存放在/.../trunk目錄下,客戶(hù)需要的定制化需要修改源代碼,而且未來(lái)的時(shí)間還會(huì)有不斷的需求提出。
此時(shí)就給我們帶來(lái)了一個(gè)問(wèn)題了:假如我們?yōu)榱送瓿煽蛻?hù)的定制化要求,直接在/trunk下修改源代碼然后提交。那么會(huì)直接影響到其他通用產(chǎn)品。所以我們本能的想法就是:再創(chuàng)建一個(gè)源代碼的拷貝,然后對(duì)這個(gè)拷貝進(jìn)行獨(dú)立修改。以一個(gè)獨(dú)立項(xiàng)目的形式進(jìn)行版本控制。
這樣的想法很好,但是又帶來(lái)了一個(gè)潛在的問(wèn)題:假如現(xiàn)在發(fā)現(xiàn)在/trunk目錄的源代碼存在重大bug,需要馬上修正并更新到所有的分組去這樣的工作怎么做?
和其他版本控制工具一樣,SVN也提供了分支的概念。“分支”實(shí)質(zhì)上也是一個(gè)普通的版本庫(kù)中的目錄。不同的是它是從其他主干或分支復(fù)制而來(lái),它和主干或其他分支“共享”了一段相同的版本歷史,然后在它被創(chuàng)建之時(shí)起又有了它獨(dú)立的版本歷史。
現(xiàn)在我們來(lái)模擬“分支”創(chuàng)建的過(guò)程和應(yīng)用。假設(shè)經(jīng)過(guò)一段時(shí)間開(kāi)發(fā)和測(cè)試之后,ECoupon項(xiàng)目已經(jīng)成熟。此時(shí)項(xiàng)目負(fù)責(zé)人決定在版本庫(kù)上開(kāi)放一個(gè)ECoupon_GA目錄,在這個(gè)目錄下包含了三個(gè)子目錄:





現(xiàn)在我們需要做的事情包括:
A.把ECoupon項(xiàng)目的代碼Import到ECoupon_GA項(xiàng)目下
B.為ECoupon_GA項(xiàng)目創(chuàng)建一個(gè)分支,位置在/branches/paul下
關(guān)于第一個(gè)問(wèn)題很好解決,有兩種方式:
A.從本地的E:\Temp\ECoupon項(xiàng)目下導(dǎo)出代碼,再導(dǎo)入到ECoupon_GA/trunk目錄下
B.從版本庫(kù)的ECoupon下拷貝到ECoupon_GA/trunk目錄下
下面我們來(lái)試一下使用svn copy命令來(lái)直接從版本庫(kù)拷貝的做法。還記得我們?cè)谇懊嫣岬降膕vn copy URL URL的用法嗎?



可是拷貝的結(jié)果有些不如所愿,原因是svn copy時(shí)會(huì)把頂層目錄也一起拷貝,而我們只想拷貝目錄下的子目錄和文件
如果我們想采用下面的方法,會(huì)很遺憾的發(fā)現(xiàn)行不通


很不幸,在SVN中不會(huì)實(shí)現(xiàn)任何的通配符。也就是說(shuō)在SVN中尼使用通配符是沒(méi)有用的。那么假如要拷貝的源目錄下有很多目錄和文件,難道要我們一個(gè)個(gè)執(zhí)行svn copy 命令嗎?答案是使用操作系統(tǒng)的批處理命令或Shell命令。
下面我們來(lái)看如何把trunk目錄下的內(nèi)容拷貝到分支“paul”那里去







我們看到“創(chuàng)建分支”居然和普通的拷貝動(dòng)作一摸一樣!是的對(duì)SVN來(lái)說(shuō),主干、分支、標(biāo)記都是普通的目錄而已,這些都是人為加上的意義。
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。