不带差异的git log -L

10
我尝试使用git log -L <start>,<end>:<filename>,但我只想要非常有限的输出(实际上只有哈希值)。虽然--pretty以我想要的格式打印提交信息,但我没有找到不显示差异的方法...
例如,在linux-next上我尝试过:
git log --pretty=format:"%H" -s -L 70,70:./arch/x86/include/asm/irqflags.h

根据man页,-s参数应该抑制diff的输出,但实际上输出如下:

$ git log --pretty=format:"%H" -s -L 70,70:./arch/x86/include/asm/irqflags.h
6abcd98ffafbff81f0bfd7ee1d129e634af13245
diff --git a/include/asm-x86/irqflags.h b/include/asm-x86/irqflags.h
--- a/include/asm-x86/irqflags.h
+++ b/include/asm-x86/irqflags.h
@@ -1,2 +64,1 @@
-#ifdef CONFIG_X86_32
-# include "irqflags_32.h"
+{

96a388de5dc53a8b234b3fd41f3ae2cedc9ffd42
diff --git a/include/asm-x86/irqflags.h b/include/asm-x86/irqflags.h
--- /dev/null
+++ b/include/asm-x86/irqflags.h
@@ -0,0 +1,2 @@
+#ifdef CONFIG_X86_32
+# include "irqflags_32.h"

我正在使用 git 版本 2.10.2


你可以尝试使用类似这样的方式来解决它吗?git blame -L70,70 ./arch/x86/include/asm/irqflags.h | cut -d ' ' -f1 - crea1
不行,那只能给我最后一次更改该行的提交记录,而不是历史记录。因此,在上面的示例中,我只会收到6abcd98f,但没有96a388de,谢谢! - andipla
3个回答

7

随着Git 2.22(2019年第二季度)的推出,这将更加清晰。

"git log -L<from>,<to>:<path>"与"-s"一起使用时没有按照预期抑制补丁输出。
这已得到纠正。

请参见提交 05314ef(2019年3月11日)和提交 9f607cd(2019年3月7日),作者为Jeff King(peff
Junio C Hamano -- gitster提交31df2c1中合并,时间为2019年4月9日。

line-log:检测不支持的格式

如果您在使用 "log -L" 时选择了 "--raw" 或者 "--stat" 的输出格式,我们会自动忽略这些格式并输出普通的补丁。
现在我们将检测并提示用户,至少可以让用户知道发生了什么事情。
现在它将清晰地显示:
-L does not yet support diff formats besides -p and -s

随着Git 2.25(2020年第一季度)的推出,文档增加了更多内容。

请参见提交记录2be4586提交记录2be4586(2019年12月26日),由Philippe Blain (phil-blain)撰写。
(由Junio C Hamano -- gitster --提交记录c4117fc中合并,于2020年1月6日)

文档:loggitk:记录接受的行日志差异格式

目前,行日志功能(git log -L)仅支持显示补丁输出(-p | --patch,其默认行为)和抑制它(-s | --no-patch)。

在代码中添加了一个检查以达到这个效果05314efline-log:检测不支持的格式,2019-03-10),但文档没有更新。

明确提到:

  • -L意味着-p,可以使用-s抑制补丁输出,
  • 所有其他差异格式都不允许。
git log -L <start>,<end>:<file>中,行号、正则表达式或偏移量参数以及git log -L :<funcname>:<file>中的函数名称正则表达式必须存在于起始版本中,否则该命令将以致命错误退出。此外,您可以多次指定此选项,但其他差异格式(即--raw--numstat--shortstat--dirstat--summary--name-only--name-status--check)目前尚未实现,虽然可以使用--no-patch来抑制补丁输出,但是会隐含--patch
在Git 2.30(2021年第一季度),文档记录了“git log(man)”不需要路径规范,但是命令行选项解析器没有执行此操作,现已进行更正。

查看 提交 39664cb (2020年11月4日) 作者为 Junio C Hamano (gitster)
(合并于 提交 f8a1cee,由Junio C Hamano -- gitster -- 于2020年11月18日)

log:将与路径规范一起使用的-L诊断为错误

由Jeff King提供帮助

-L选项的文档规定不接受路径模式,但是命令行选项解析器迄今为止一直允许这种组合而没有进行检查。
确保在使用-L选项时没有路径模式以修复此问题。

顺便说一下,这个更改还修复了命令行选项解析器中的另一个错误,该错误允许同时使用-L选项和--follow选项。
因为后者需要给出一个确切的路径,但前者不接受路径模式,它们自动变得相互不兼容。
由于-L选项会单独跟踪重命名,所以没有必要同时使用--follow选项。

新的测试表明,它们可能失败并显示“-L--follow不兼容”,而不是“-L和路径模式不兼容”。 目前,预期的失败只能来自后者,但这是为了未来的兼容性,以防我们决定添加代码来明确禁止同时使用-L--follow


1

一个grep的解决方案是将输出管道传递给grep,仅打印与提交匹配的行:

git log -L 10,11:example.txt | grep 'commit \w' -A 4

grep匹配每个日志条目的第一行,使用-A标志打印接下来的4行。

然而它有点冗长。如果有更好的解决方案,我很乐意听取!


1
更新:Git 2.22及更高版本现在支持将-L-s混合使用。请参见VonC的答案

-L选项当前(显然从未)与-s / --no-patch不兼容,因为在生效-L时从line_log_print调用this code,从 log_tree_commit的顶部调用。该代码仅输出任何匹配提交中选择的行范围。(您可以修补该黑客程序以遵守差异输出选项。)

(另一个明显的解决方法是使用git rev-list而不是git log,但正如第一个链接所指出的那样,-L首先并没有得到正确集成,因此git rev-list无法处理它。)


谢谢你提供这么精确的答案...我将直接使用git log,并用egrep过滤出包含提交信息的那一行。 - andipla

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