为什么git log命令不默认加上--follow参数?

24
如果我们将文件移动到不同的位置或重命名,除非我们专门使用git log --follow,否则它的所有先前历史记录都会在git log中丢失。我认为通常情况下,预期的行为是我们想要看到过去的历史记录,而不是在重命名或移动后“切断”,那么为什么git log不默认使用--follow标志呢?

3
Git 2.6+(2015年第三季度)将提供git config log.follow true选项:请参见下面的答案 - VonC
2个回答

47
注意:从git 2.6(2015年第三季度)开始,默认情况下,git log可以跟踪文件的历史记录!请参见提交076c983(2015年7月8日),作者为David Turner(dturner-tw
(由Junio C Hamano -- gitster --提交2dded96中合并,2015年8月3日)

log:添加“log.follow”配置变量

在大多数线性历史记录且频繁重命名整个文件的项目中工作的人可能希望在检查单个路径中存在的内容的生命周期时始终使用“git log --follow”。

当设置了log.follow配置变量并且命令行上有一个(且仅有一个)路径时,教会命令表现得好像从命令行给出了“--follow”一样。

git config log.follow true

注意:还有一个选项(奇怪的是,即使到了2020年和Git 2.25,仍没有文件记录),--no-follow选项可以覆盖log.follow配置设置。
Vser提出了一个补丁建议
Jeff King (peff)指出了相同的提交我在讨论中提到的提交aebbcf5,Git 1.8.2,2012年9月引入了--no-follow


2
一个很大的警告是,follow=true 会隐藏合并提交,这在看似无害的命令中如 git log -- ./subproject 中体现得尤为明显。这几乎感觉像是 Git 的一个 bug,但它在各种操作系统和版本中都能够一致地表现出来,所以也许我对于当给定一个目录路径规范时 --follow 应该做什么存在误解。 - Borek Bernard
1
由于没有 --no-follow 选项,有没有一种方法可以在不更改它的情况下覆盖此选项?使用情况类似于这个例子(请参见答案的评论)。 - Vser
1
@Vser 当然,对于一个命令:git -c log.follow= log:这将取消 log.follow,只针对该 git log 实例。 - VonC
然而,t4202-log.sh测试了这个并且git确实识别了这个参数。那么问题可能在文档中 :) - Vser
1
@Vser,我已经更新了答案并加入了你的修补建议。 - VonC
显示剩余5条评论

8

很可能是因为git log通常用于显示整体提交历史,而不是单个文件或路径的历史记录。如果您查看单个文件,则--follow选项才相关(并且在命名多个文件时无效)。由于这不是最常见的情况,将其作为默认选项并没有太多意义。

如果您希望将其作为默认选项,请随时创建别名:

git config --global alias.lf 'log --follow'

现在你可以使用 git lf <filename> 命令来获得你想要的行尾换行符。请注意:如果您想向邮件列表建议所请求的更改并了解大家的想法,您可以在此处进行 提交。或者,更好的方法是,您可以提交一个补丁

啊哈,所以如果只有一个文件,那么默认使用 --follow 可能是有意义的。不跟随多个文件的原因可能是由于速度方面的考虑? - nonopolarity
@動靜能量:我不想臆測,但那似乎不太可能。Git 允許你進行許多選項,這些選項計算成本非常高昂(例如複雜的變基等)。 - John Feminella

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