2012-09-25 57 views
6

以下我的問題Git subtree export and re-import woes我想問我如何將文件夾轉換爲子樹。使現有的文件夾git subtree

想象一下,我有一個倉庫A,其中我現在應該與另一個項目(可能更多)共享代碼,因此我將所有共享代碼放在文件夾「sub」中。這個文件夾現在應該被提取出來(如果可能的話,沒有歷史記錄)到倉庫C中。之後,「sub」應該成爲C的一個子樹,但是不會丟失A中的歷史記錄(非常重要)。我也希望能夠在「sub」中進行更改,並將它們推回到C.

回答

7

git subtree split正是如此。給定一個通過--prefix的文件夾,它將在您的回購庫中生成一個單獨的樹,您可以推送到另一個存儲庫,然後按照您認爲合適的方式使用。

當前版本的git(1.8.1)不包括子樹的文件,但你可以在這裏找到:https://github.com/apenwarr/git-subtree/blob/master/git-subtree.txt

您可以使用流程是:

# In Repo A create your subtree split and push it 
> git subtree split --prefix sub --branch subBranch 
> git push C subBranch:master 

# After some changes that touched the sub directory 
> git subtree push --prefix sub C master 

最後的命令WIL重新拆分樹(使用之前分離的提交以保持C的樹完整性)並將其推送到C/master

如果你想刪除的歷史內容推送到C可以使用--squash選項時git split -ing和git push -ing。你必須保持一致,並繼續使用它,因爲如果你開始混合壓扁和未壓縮的內容子樹將無法正確拆分和重用previos分割,因此你將無法將其推送到C

最後,一旦你創建了sub的第一個分割,你不需要刪除它並將其重新導入爲一個新的子樹。如果你保留它git subtree將只是從其他拆分重新生成/重用先前創建的提交。如果刪除了文件夾,然後從創建的提交中重新添加sub,它應該仍然有效,並且如果您使用的是--squash,它將與您想要的C沒有歷史記錄,但保留A歷史記錄)相匹配。

相關問題