跟着我的这个问题Git subtree export and re-import woes,我想问如何将一个文件夹转换为一个子树。
假设我有一个名为 A 的代码库,我想与另一个项目(可能还有更多)共享代码,所以我把所有共享的代码放在 "sub" 文件夹中。现在应该将该文件夹提取出来(如果可能的话不带历史记录)到裸库 C 中。之后,“sub”应该成为C的一个子树,但是不要失去A中的历史记录(非常重要)。我还想能够在 "sub" 中进行更改并将其推回到C中。
跟着我的这个问题Git subtree export and re-import woes,我想问如何将一个文件夹转换为一个子树。
假设我有一个名为 A 的代码库,我想与另一个项目(可能还有更多)共享代码,所以我把所有共享的代码放在 "sub" 文件夹中。现在应该将该文件夹提取出来(如果可能的话不带历史记录)到裸库 C 中。之后,“sub”应该成为C的一个子树,但是不要失去A中的历史记录(非常重要)。我还想能够在 "sub" 中进行更改并将其推回到C中。
git subtree split
命令可以实现这一点。通过 --prefix
指定一个文件夹,它将在你的仓库内生成一个独立的树,然后可以将其推送到另一个仓库中并根据需要使用。# 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 split
和git push
时使用--squash
选项。您必须始终如一地使用它,因为如果您开始混合压缩和非压缩的内容子树将无法正确拆分和重用之前的拆分,因此您将无法将其推送到C
。
最后,一旦创建了sub
的第一个拆分,就不完全需要删除它并将其重新导入为新的子树。如果保留它,git subtree
将仅从其他拆分中生成/重用以前创建的提交。如果您确实删除文件夹,然后从创建的提交中重新添加sub
,它仍应该工作,如果您使用--squash
,它将匹配您希望的C
没有历史记录,但保留A
的历史记录)。