我一直在玩這個一點點,它看起來像最簡單的方法來分割這件事是使用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
而且我認爲我們已經實現了自己的目標。
謝謝!這看起來非常適合這份工作。優秀例子的獎勵積分。 – JFlo 2015-02-06 16:43:13
這對於大分手來說非常合適。現在我想從原始的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