在 "git filter-branch" 命令中,"--tree-filter" 和 "--index-filter" 有什么区别?

13
我从这篇文章中学到了"tree"和"index",文章链接:通过例子了解Git内部原理。但是在使用"git filter-branch"命令时,我不知道"--tree-filter"和"--index-filter"有什么区别。请帮忙解释一下。

1
你有阅读过文档吗? - Tim Biegeleisen
6
我会,但我发现这些Git概念很难理解... - GoTop
1
一个人不可能简单地阅读文档,@TimBiegeleisen!还有徽章可以获得!(顺便说一句,你的名字很棒 ;) ) - timhc22
1个回答

21
--tree-filter会将每个提交检出到临时目录中,运行您的过滤器命令,并从临时目录中构建新提交;而--index-filter会将每个提交复制到索引中,运行您的过滤器命令,并从现在在索引中的内容构建新的提交。
将提交复制到索引中比检出提交快得多。 从索引中构建提交比从目录中构建提交更快。 因此,使用索引过滤器比使用树过滤器要快得多。 不过,它不太容易脚本化。
精确的速度差异取决于临时目录:内存文件系统比SSD文件系统快,后者比旋转介质快,因此如果您可以将树过滤器指向内存文件系统,则可以获得更大的收益。 但即使如此,索引过滤器仍然更快。
在实际磁盘上,我看到了大约100倍左右的速度差异(因此需要2分钟的索引过滤器将转换为需要3个多小时的树过滤器)。

@torek 的额外研究真是太棒了,仅仅通过阅读文档是无法掌握这些知识的! - timhc22
1
@timhc22:我这里是根据一些历史数值进行估算。在200x年代中期或201x年代初期,我进行了大量的代码库维护工作。曾经不得不使用真正的旋转式媒体,后来有一个ramdisk文件系统可以用于部分操作... - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接