2015-02-06 88 views
0

假設我已經寫了一個zillion傀儡模塊,並且在一個git倉庫中有完整的歷史記錄,但現在我真的希望每個模塊都有一個倉庫回購。分割文件結構很容易,因爲每個文件都完全包含在其自己的目錄中,並且組織得像GIT_ROOT/modules/名稱具有相關歷史的部分git克隆

有沒有一種方法可以分開這個回購,而不是放鬆每個模塊的歷史?理想情況下,每個回購僅具有與其所代表的模塊相關的歷史記錄。我試圖克隆整個事物和所有不相關的東西,但保留了無關歷史。

我打算用git submodules將它們粘在一起,FWIW。

回答

1

我一直在玩這個一點點,它看起來像最簡單的方法來分割這件事是使用git subtree split

分裂

提取一個新的,綜合項目歷史來自子樹的歷史 。新歷史記錄僅包含受影響的提交(包括合併)的 ,並且這些提交的每個 現在都具有項目根目錄 而不是子目錄中的內容。因此, 新創建的歷史記錄適合作爲單獨的 git存儲庫導出。

因此,舉例來說,如果我開始與openstack-puppet-modules庫,其中包括了一堆各個木偶的模塊,我可以先其拆分成類似這樣的個別分行(我只使用八個模塊這裏讓事情短):

for x in apache aviator ceilometer certmonger cinder common \ 
    concat firewall; do 
    git subtree split -P $x -b split-$x 
done 

一旦運行結束後,我有:

$ git branch | grep split- 
split-apache 
split-aviator 
split-ceilometer 
split-certmonger 
split-cinder 
split-common 
split-concat 
split-firewall 
split-pacemaker 

每這些分支只包含了特定歷史10目錄。如果我想將這些轉化成不同的版本庫,我 可以這樣做:

for x in apache aviator ceilometer certmonger cinder common \ 
    concat firewall; do 
    git init --bare ../repos/repo-$x 
    git push ../repos/repo-$x split-$x:master 
done 

現在我有庫的集合:

$ ls ../repos/ 
repo-apache repo-aviator repo-ceilometer repo-certmonger 
repo-cinder repo-common repo-concat repo-firewall work-cinder 

而且我認爲我們已經實現了自己的目標。

+0

謝謝!這看起來非常適合這份工作。優秀例子的獎勵積分。 – JFlo 2015-02-06 16:43:13

+0

這對於大分手來說非常合適。現在我想從原始的Git倉庫中核對每個Puppet模塊,以便我可以將它們作爲Git子模塊重新引入。我讀過http://git-scm.com/book/en/v2/Git-Tools-Rewriting-History#The-Nuclear-Option:-filter-branch,看起來下面是完美的:'git filter -branch -f --index-filter「git rm -rf --cached --ignore -unmatch modules/$ NAME」HEAD「。事實上,它將它從工作樹中移除,但每個模塊的歷史依然存在?有沒有一種很好的方法來保護它們並保留剩菜的歷史? – JFlo 2015-02-08 17:19:54