2014-05-16 67 views
0

我正在將大型和複雜的多模塊Maven項目從基於SVN的版本控制轉移到Git。將異國情調的回購結構從SVN移植到Git

作爲背景的一種方式,整個項目曾經住在一個SVN倉庫中。該項目由許多後端/守護程序模塊組成。一個核心前端模塊,然後是一些客戶特定的前端實現。

我們結束了(超過5年左右,因爲這些事情往往會發生)是一個非常奇怪的結構。一切都在一個SVN回購,但每個模塊有它自己的trunk,tagsbranches文件夾和獨立發佈週期。

在移植到Git時,我們決定將模塊移至自己的獨立Git倉庫。我們使用git svn,因此將每個模塊的trunk,tagsbranches文件夾導出到Git倉庫中,以保留標籤和分支。

到目前爲止這麼好。

現在我遇到了一個問題,我不知道最好的辦法。

我有什麼是一些客戶特定的前端模塊。這些主要包含模板和本地化文件 - 用於品牌塑造等。

我們如何在SVN上做到這一點是我們有一個Trunk模塊,它有trunk,tagsbranches。當我們需要爲我們的客戶品牌產品時,我們將svn cp兩個整批放入另一個文件夾中,比如ClientA

所以現在我們有

Trunk 
    /trunk 
    /tags 
    /branches 
ClientA 
    /trunk 
    /tags 
    /branches 

因此,獨立工作繼續在兩個項目。事物被標記和分支,並獨立合併。

但是如果在前端代碼中發現錯誤,或者添加了有用的功能,我們會合並Trunk/trunk <-> ClientA/trunk。因爲整個項目是一個svn cp SVN可以優雅地處理這個合併(幾乎)。

那麼我該如何去做類似Git的事情呢?

我可以看到兩大類方法:

1)保持在一個混帳回購整個前端代碼,並命名爲客戶具體項目的分支。對分支和標籤使用一些命名約定。這將允許我們跨分支合併。

這樣做的缺點是,它似乎真的哈克。維護一個噩夢(哎呀,我把我的功能分支合併到錯誤的客戶端分支)。而且也很醜陋。

2)將項目分成自己的Git倉庫。這具有清潔的主要優點。這些項目有不同的生命週期,所以他們應該在不同的回購。

這裏的缺點是跨項目合併大概需要使用補丁文件完成。

那麼,有沒有人有移植類似Git的東西的經驗。你做了什麼?你如何維護它?你遇到了什麼問題?得到教訓?

做任何Git的大師有一個聰明的想法,我可以如何做到這一點的另一種方式?

回答

1

這裏的缺點是跨項目合併大概需要使用補丁文件來完成。

沒有。您有完全正確的想法,在單獨的存儲庫中分別開展工作並根據需要合併它們。這正是「遙控器」的用途。

我們合併中繼線/中繼線↔客戶端A /後備箱

啓動條件:所有的工作的主幹線存儲庫,它的時間clientA上工作。做客戶工作,

git clone u://r/l/Trunk -b trunk ClientA # or /path/to/Trunk if your fs is shared 

當中繼的主幹分支工作需要合併到客戶端A的主幹分支,在客戶端A的存儲庫這樣做:

git pull 

在樹幹分支,即可大功告成。

如果您碰巧有工作不想在當前工作樹中打擾,請克隆一個輕量級臨時存儲庫,在那裏進行合併並將其推回。你會發現庫之間所有其他需要的通信都是直接的。

+0

我沒有想到這個 - 對Git來說還是新手。所以你建議把'Trunk'作爲'ClientA'的一個遠程設備,所以我有一些遠程的「origin」 - 這是推送CI的改變,也許是一個遠程的「trunk」,我可以通過它來與'Trunk'合併。聰明。有沒有辦法讓這個設置自動化 - 即當其他人克隆了ClientA時遙控器已經存在了?我們計劃將Gitorious或Gitlab用於私人中央回購管理器。 –

+0

根據需要或方便克隆,這是完全正確的。當你克隆的時候,克隆的repo獲得原始的'origin'作爲遠程的,所以這部分已經在上面完成了,git提供了默認的pull,因爲這個場景很常見,完整的拼寫是'git pull origin trunk'。 – jthill

+0

要提供默認配置,請使用模板目錄並使用任何您想要的預加載它們。 – jthill