2010-09-17 142 views
4

我一直在試圖擺脫子模塊,以獲得一個自包含的存儲庫,並且subtree merge strategy似乎匹配此用例。Git子樹合併策略,可能沒有合併歷史?

但是合併回購的歷史出現在我自己的項目歷史中,這是令人厭煩的。

我試過git filter-branch --subdirectory-filter path/to/subtree/ HEAD它的工作原理......直到我嘗試用git pull -s subtree my-subtree master更新子樹,它將所有子樹的文件重寫到我的項目根目錄。

有沒有辦法在git中實現這個本身?

回答

7

apenwarrgit subtree有一個--squash選項,可能會做得非常接近你想要的。在它生成的提交的提交信息

remote=libfoo 
branch=master 
prefix=helpers/libfoo 

git fetch "$remote" && 
git subtree add --prefix="$prefix" --squash "$remote/$branch" 

: Later, once there are changes to pick up. 
git subtree pull --prefix="$prefix" --squash "$remote" "$branch" 

git的子樹記錄額外的信息;這種額外的信息使其能夠有效地進行合併,而不必合併被合併的子樹的實際歷史記錄。


如果你知道你將永遠不會給子樹的任何變化,在「超級」存儲庫(即所有的子樹中的變化總是會從別的庫),那麼你可以做無混帳子樹,並重復子樹合併方法的git read-tree --prefix=部分(儘管您必須先從兩個索引中清除當前子樹)。

remote=libfoo 
branch=master 
prefix=helpers/libfoo/ 

: replace the local subtree with whatever the other repository has 
git fetch "$remote" && 
git rm -r --ignore-unmatch "$prefix" && 
git read-tree --prefix="$prefix" "${remote}/${branch}" && 
git checkout -- "$prefix" && 
git commit -m "update $prefix from $remote $branch" 
+0

我希望它是能夠維持地方在不依賴依賴的情況下爲子樹創建分支,似乎無法在這裏擁有你的蛋糕並將其吃掉......我將這個問題留待了幾天,以防有人想出一些神奇的方式來只使用git來實現這一點。謝謝克里斯。 – julien 2010-09-18 12:31:24

0

如果讀取的時候「git的日誌」,那麼你可能想嘗試只是一個煩惱:

git log --first-parent 

那隻能說明你的提交和(單)合併提交,但不遠程提交。

如果你想用一個diff(對於合併提交,這將創造一個大的差異)看到它:

git log -p -m --first-parent 

沒有額外的工具需要:)