9

在我的问题Git subtree export and re-import woes之后,我想问我如何将文件夹转换为子树。

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

4

1 回答 1

11

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.

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

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

于 2013-01-22T08:44:16.690 回答