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
,将来也应该有相同的用法。
我正在尝试了解 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
,将来也应该有相同的用法。