根据我的问题Git子树导出和重新导入的问题,我想问一下如何将文件夹转换为子树.
想象一下,我有一个存储库A,我有代码,现在应该与另一个项目共享(可能更多),所以我将所有共享代码放在文件夹"sub"中.此文件夹现在应该被提取(如果可能没有历史记录)到裸存储库C.之后"sub"应该成为C的子树,但不会丢失A中的历史(非常重要).我也希望能够在"sub"中进行更改并将它们推回到C.
git subtree split就是这么做的.给定一个文件夹,--prefix它将在您的repo中生成一个单独的树,您可以将其推送到另一个存储库,然后根据需要使用.
当前版本的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
Run Code Online (Sandbox Code Playgroud)
最后一个命令将重新拆分树(使用先前拆分的提交以保持C的树完整性)并将其推送到C/master.
如果要删除推送到的内容的历史记录,C可以--squash在git split-ing和git push-ing 时使用该选项.您必须保持一致并继续使用它,因为如果您开始混合压扁和非压缩内容子树将无法正确拆分和重用previos拆分,因此您将无法将其推送到C.
最后,一旦你创建了sub它的第一个拆分,并不是完全要求你删除它并将其重新导入为一个新的子树.如果保留它将git subtree只重新生成/重用其他拆分中先前创建的提交.如果您确实删除了该文件夹,然后sub从创建的提交中重新添加它仍然可以工作,如果您使用--squash它将匹配您想要的C没有历史记录,但保留A历史记录).