使现有文件夹成为git子树

时间:2012-09-25 20:50:12

标签: git git-subtree

关注我的问题Git subtree export and re-import woes我想问一下如何将文件夹转换为子树。

想象一下,我有一个存储库A,我的代码现在应该与另一个项目共享(可能还有更多),所以我将所有共享代码放在文件夹“sub”中。此文件夹现在应该被提取(如果可能没有历史记录)到裸存储库C.之后“sub”应该成为C的子树,但不会丢失A中的历史(非常重要)。我还希望能够在“sub”中进行更改并将它们推回到C.

1 个答案:

答案 0 :(得分:8)

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

最后一个命令将重新拆分树(使用先前已拆分的提交以保留C的树完整性)并将其推送到C/master

如果您要删除推送到C的内容的历史记录,则可以在--squashgit split时使用git push选项。您必须保持一致并继续使用它,因为如果您开始混合压扁和非压缩内容子树将无法正确拆分并重复使用previos拆分,因此您将无法将其推送到C

最后,一旦您创建了sub的第一个分割,就不一定要删除它并将其重新导入为新的子树。如果保留它git subtree将只重新生成/重用其他拆分中先前创建的提交。如果你确实删除了该文件夹,然后从创建的提交中重新添加sub它仍然可以正常工作,如果你使用的是--squash,它将匹配你想要的C没有历史记录,但保留A历史记录。