git filter-branch subdirectory-filter & git subtree split -P 的区别

Difference between git filter-branch subdirectory-filter & git subtree split -P

我正在尝试了解 git 子树拆分和 git 过滤器分支之间的区别,用于特定用例。本题与Difference between git filter branch and git subtree?相似,但不完全相同

给定一个带有 /sub/folder 的 repo,执行这些命令:

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 的修订图看起来是一样的:

...这两个分支的日志看起来一样,工作目录看起来也一样。我发现许多 questions/posts 试图解释过滤器分支和子树拆分之间的区别,但基于上述内容,我只是没有看到它。如果它们确实产生相同的结果,那么引入子树拆分 -P 的意义何在?它基本上只是 filter-branch --subdirectory-filter 的别名吗?

短的部分就像你在:

... in my use case above there is no difference.

但是,一般的建议是使用 git subtree:它更直接,更不容易出错,并且即使在 git filter-branch 停止时也应该继续工作 某天工作。

更多详情

基本上,您已经独立地重新发现了 git subtree 命令是如何出现的:各种用户想要获取他们现有的存储库,提取其中的一部分——通常是一个库——并将其导出为新 Git 存储库。 git filter-branch 命令可以做到这一点,所以他们就是这样做的。

它非常流行,也非常有用,以至于 git filter-branch 开发了一个名为 --subdirectory-filter 的过滤器专门用于这项工作。请参阅 Johannes Schindelin 于 2007 年撰写的 commit 685ef546b62d063c72b401cd38b83a879301aac4,首次发布于 Git 版本 1.5.3。

子树分裂本身还不够(git filter-branch 是一种过于强大的危险工具),因此在 2009 年 4 月,Avery Pennarun 引入了 git subtree 命令,从 [=31] 开始=] 作者:本·沃尔顿。所有这些都在 Git 1.7.11.

中发布

最近,git filter-branch 本身已被正式弃用:它很难正确使用,速度慢,而且通常不是很好。一个新的 git filter-repo 命令更快、更有用,尽管它确实需要您足够了解 Python 才能使用它,而且它仍然没有随 Git 本身一起分发。但是 git subtree 具有特定用途而不是一般用途,它将保留下来,并且即使 git filter-repo 实际上完全取代了 git filter-branch,将来也应该有相同的用法。