将现有文件夹变成Git子树

11

跟着我的这个问题Git subtree export and re-import woes,我想问如何将一个文件夹转换为一个子树。

假设我有一个名为 A 的代码库,我想与另一个项目(可能还有更多)共享代码,所以我把所有共享的代码放在 "sub" 文件夹中。现在应该将该文件夹提取出来(如果可能的话不带历史记录)到裸库 C 中。之后,“sub”应该成为C的一个子树,但是不要失去A中的历史记录(非常重要)。我还想能够在 "sub" 中进行更改并将其推回到C中。

1个回答

12
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的内容的历史记录,可以在git splitgit push时使用--squash选项。您必须始终如一地使用它,因为如果您开始混合压缩和非压缩的内容子树将无法正确拆分和重用之前的拆分,因此您将无法将其推送到C

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接