posts - 262,  comments - 221,  trackbacks - 0

          【18】創(chuàng)建分支


          在企業(yè)級產品的開發(fā)過程中,除了通用產品之外,有時會存在一些需要根據客戶實際情況進行“定制化”的情況。假設現(xiàn)在我們產品的代碼存放在/.../trunk目錄下,客戶需要的定制化需要修改源代碼,而且未來的時間還會有不斷的需求提出。

          此時就給我們帶來了一個問題了:假如我們?yōu)榱送瓿煽蛻舻亩ㄖ苹螅苯釉?trunk下修改源代碼然后提交。那么會直接影響到其他通用產品。所以我們本能的想法就是:再創(chuàng)建一個源代碼的拷貝,然后對這個拷貝進行獨立修改。以一個獨立項目的形式進行版本控制。

          這樣的想法很好,但是又帶來了一個潛在的問題:假如現(xiàn)在發(fā)現(xiàn)在/trunk目錄的源代碼存在重大bug,需要馬上修正并更新到所有的分組去這樣的工作怎么做?

          和其他版本控制工具一樣,SVN也提供了分支的概念。“分支”實質上也是一個普通的版本庫中的目錄。不同的是它是從其他主干或分支復制而來,它和主干或其他分支“共享”了一段相同的版本歷史,然后在它被創(chuàng)建之時起又有了它獨立的版本歷史。

          現(xiàn)在我們來模擬“分支”創(chuàng)建的過程和應用。假設經過一段時間開發(fā)和測試之后,ECoupon項目已經成熟。此時項目負責人決定在版本庫上開放一個ECoupon_GA目錄,在這個目錄下包含了三個子目錄:

          C:\>svn list http://localhost:8000/svn/Workspace/Ericsson/ECoupon_GA --depth=infinity
          branches
          /
          tag
          /
          trunk
          /
          trunk
          /paul/

          現(xiàn)在我們需要做的事情包括:
           A.把ECoupon項目的代碼Import到ECoupon_GA項目下
           B.為ECoupon_GA項目創(chuàng)建一個分支,位置在/branches/paul下

          關于第一個問題很好解決,有兩種方式:
           A.從本地的E:\Temp\ECoupon項目下導出代碼,再導入到ECoupon_GA/trunk目錄下
           B.從版本庫的ECoupon下拷貝到ECoupon_GA/trunk目錄下

          下面我們來試一下使用svn copy命令來直接從版本庫拷貝的做法。還記得我們在前面提到的svn copy URL URL的用法嗎?

          C:\>svn copy http://localhost:8000/svn/Workspace/Ericsson/ECoupon http://localhost:8000/svn/Workspace/Ericsson/ECoupon_GA/trunk   -"copy directly from ECoupon to ECoupon_GA/trunk"

          Committed revision 
          31.

          可是拷貝的結果有些不如所愿,原因是svn copy時會把頂層目錄也一起拷貝,而我們只想拷貝目錄下的子目錄和文件



          如果我們想采用下面的方法,會很遺憾的發(fā)現(xiàn)行不通

          C:\>svn copy http://localhost:8000/svn/Workspace/Ericsson/ECoupon/trunk/*   http://localhost:8000/svn/Workspace/Ericsson/ECoupon/branches/paul  -"create branch of ECoupon project for user Paul"
          svn: Path 
          'http://localhost:8000/svn/Workspace/Ericsson/ECoupon/trunk/*' does not exist in revision 31

          很不幸,在SVN中不會實現(xiàn)任何的通配符。也就是說在SVN中尼使用通配符是沒有用的。那么假如要拷貝的源目錄下有很多目錄和文件,難道要我們一個個執(zhí)行svn copy 命令嗎?答案是使用操作系統(tǒng)的批處理命令或Shell命令。

          下面我們來看如何把trunk目錄下的內容拷貝到分支“paul”那里去
          C:\>svn copy http://localhost:8000/svn/Workspace/Ericsson/ECoupon_GA/trunk/doc http://localhost:8000/svn/Workspace/Erics
          son
          /ECoupon_GA/trunk/src http://localhost:8000/svn/Workspace/Ericsson/ECoupon_GA/trunk/WebRoot http://localhost:8000/svn
          /Workspace/Ericsson/ECoupon_GA/trunk/read-from-repo.txt http://localhost:8000/svn/Workspace/Ericsson/ECoupon_GA/trunk/re
          ad
          -from-wc.txt http://localhost:8000/svn/Workspace/Ericsson/ECoupon_GA/branches/paul -"copy resources from trunk to br
          anch"

          Committed revision 
          38.

          我們看到“創(chuàng)建分支”居然和普通的拷貝動作一摸一樣!是的對SVN來說,主干、分支、標記都是普通的目錄而已,這些都是人為加上的意義。


          -------------------------------------------------------------
          生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
          posted on 2009-12-10 17:04 Paul Lin 閱讀(403) 評論(0)  編輯  收藏 所屬分類: 項目管理
          <2009年12月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 湖口县| 金秀| 花垣县| 兖州市| 班玛县| 四子王旗| 买车| 合作市| 遵化市| 正宁县| 鄂州市| 瓮安县| 美姑县| 冀州市| 南充市| 林周县| 龙陵县| 吴江市| 揭东县| 新河县| 泽州县| 青冈县| 宁明县| 晴隆县| 德安县| 苏尼特右旗| 峨眉山市| 伽师县| 贵港市| 海宁市| 醴陵市| 高州市| 增城市| 泰安市| 大姚县| 鹤庆县| 乌兰浩特市| 萝北县| 西盟| 栖霞市| 渑池县|