我试图了解特定用例的git subtree split和git filter-branch之间的区别。这个问题类似于Difference between git filter branch and git subtree?,但不完全相同。
给出带有/ sub / folder的仓库,执行以下命令:
git checkout master
git checkout -b subtree-branch-1
git filter-branch --subdirectory-filter sub/folder
您最终得到一个分支,该分支仅具有适用于/ sub / folder的提交。现在让我们重新开始:
git checkout master
git subtree split -P sub/folder -b subtree-branch-2
git checkout subtree-branch-2
对我来说,我看起来完全一样。 TortoiseGit的修订图看起来相同(https://lnk2.tk/iqtvg),这两个分支的日志看起来相同,并且工作目录看起来相同。我发现了很多问题/帖子试图解释filter-branch和subtree split之间的区别,但是基于以上内容,我只是没有看到它。如果它们确实产生相同的结果,那么引入子树split -P的意义何在?它基本上只是filter-branch --subdirectory-filter的别名吗?
简短部分就像您在comment summary中输入的一样:
...在我上面的用例中没有区别。
但是,一般建议是使用git subtree
:它更直接,更不易出错,并且即使git filter-branch
stops有一天能工作也应该继续工作。
基本上,您已经独立地重新发现了git subtree
命令的产生方式:各种用户都希望使用他们现有的存储库,提取其中的一部分(通常是一个库),并将其导出为新的Git存储库。 git filter-branch
命令可以做到这一点,所以这就是他们所做的。
[这很受欢迎,也足够有用,git filter-branch
增长了一个名为--subdirectory-filter
的过滤器专门用于这项工作。参见Johannes Schindelin在2007年发布的commit 685ef546b62d063c72b401cd38b83a879301aac4
,该版本首次在Git版本1.5.3中发布。
[子树拆分本身本身还远远不够(并且685ef546b62d063c72b401cd38b83a879301aac4
是一种危险的功能强大的工具),所以2009年4月,Avery Pennarun从git filter-branch
开始引入了git subtree
命令,作为该工具的实验脚本。 1.7.11版本候选。这实现了拆分,并且几乎立即实现了commit 0ca71b3737cbb26fbf037aa15b3f58735785e6e3
和0ca71b3737cbb26fbf037aa15b3f58735785e6e3
。第一个实际安装的版本(而不是随Git一起分发的附件)是Ben Walton的--rejoin
。所有这些都在Git 1.7.11中发布。
最近,add
本身已被正式弃用:难以正确,缓慢地使用,并且通常不太好。一个新的commit 0d31de303f9e8e28cc1649dbf41c1cc635bae2d8
命令更快,更有用,尽管它确实需要您了解足够的Python才能使用它,并且它仍然不随Git一起分发。但是,具有特定目的而不是一般目的的0d31de303f9e8e28cc1649dbf41c1cc635bae2d8
将坚持存在,并且即使git filter-branch
实际上完全替代git filter-repo
,将来也应具有相同的用法。