git log -L 无差异
Posted
技术标签:
【中文标题】git log -L 无差异【英文标题】:git log -L without diff 【发布时间】:2017-05-16 14:31:57 【问题描述】:我正在尝试使用git log -L <start>,<end>:<filename>
,但我希望输出非常有限(实际上只是散列)。虽然 --pretty 以我想要的格式打印提交信息,但我没有找到不显示差异的方法......
例如在 linux-next 上我尝试的是:
git log --pretty=format:"%H" -s -L 70,70:./arch/x86/include/asm/irqflags.h
哪里(根据手册页)-s 应该抑制差异的输出,但是输出是:
$ 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
不,这只会给我最后一次更改该行的提交......而不是历史记录。所以在上面的例子中,我只会得到 6abcd98f 而不是 96a388de thx!
【参考方案1】:
使用 Git 2.22(2019 年第二季度)会更清楚。
“git log -L<from>,<to>:<path>
”和“-s
”没有抑制补丁
按应有的方式输出。
这已得到纠正。
参见commit 05314ef(2019 年 3 月 11 日)和 commit 9f607cd(2019 年 3 月 7 日)Jeff King (peff
)。(由 Junio C Hamano -- gitster
-- 合并于 commit 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 年第一季度),文档增加了更多内容。
参见Philippe Blain (phil-blain
)commit 2be4586、commit 2be4586(2019 年 12 月 26 日)。(由 Junio C Hamano -- gitster
-- 合并到 commit c4117fc,2020 年 1 月 6 日)
doc:
log
,gitk
:文档接受的行日志差异格式
目前行日志功能(
git log -L
)只支持 显示补丁输出(-p | --patch
,它的默认行为)并抑制它 (-s | --no-patch
)。 在05314ef 的代码中添加了一个检查以实现该效果 (line-log
:检测不支持的格式,2019-03-10)但是文档没有更新。明确提及:
-L
暗示-p
, 可以使用-s
抑制补丁输出, 并且不允许所有其他差异格式。
还有:
git log -L <start>,<end>:<file>
中的行号、正则表达式或偏移量参数或git log -L :<funcname>:<file>
中的函数名正则表达式必须存在于起始修订版中,否则命令将退出并出现致命错误。
所以,除了You can specify this option more than once
,你还有:
暗示
--patch
. 可以使用--no-patch
抑制补丁输出,但其他差异格式(即--raw
、--numstat
、--shortstat
、--dirstat
、--summary
、--name-only
、--name-status
、--check
)不能目前已实施。
在 Git 2.30(2021 年第一季度)中,“git log
(man)”被记录为不采用路径规范,但这不是由命令行选项解析器强制执行的,它已被更正了。
参见Junio C Hamano (gitster
) 的commit 39664cb(2020 年 11 月 4 日)。(由 Junio C Hamano -- gitster
-- 合并于 commit f8a1cee,2020 年 11 月 18 日)
log
: 诊断-L
与 pathspec 一起使用时出现错误由杰夫·金主持
-L
选项被记录为不接受任何路径规范,但命令行选项解析器已允许组合,但目前没有检查。 确保在-L
选项生效时没有路径规范以解决此问题。顺便说一句,此更改修复了命令行选项解析器中的另一个错误,该错误允许
-L
选项与--follow
选项一起使用。 因为后者只需要一个给定的路径,而前者没有路径规范,所以它们自动变得相互不兼容。 因为-L
选项会单独跟随重命名,所以没有理由同时给出--follow
。新测试表明它们可能会因“
-L
和--follow
不兼容”而不是“-L
和 pathspec 不兼容”而失败。 目前,预期的失败只能来自后者,但这是为了让它们在未来得到验证,以防我们决定添加代码以显式地死在-L
和--follow
一起使用。
【讨论】:
【参考方案2】:更新:Git 2.22 及更高版本现在支持将-L
与-s
混合使用。见VonC's answer。
-L
选项目前(显然从未)与-s
/ --no-patch
不兼容,因为this code 从line_log_print
调用,当-L
生效时从the top of log_tree_commit
调用.所述代码只是从任何匹配的提交中输出整个选定的行范围。 (也许你可以修补 hack 以遵守 diff 输出选项。)
(另一个明显的解决方法是使用git rev-list
而不是git log
,除了-L
,正如第一个链接所指出的那样,首先没有正确集成,因此git rev-list
无法处理它。)
【讨论】:
感谢这个非常准确的答案...我将按原样使用 git log 并 egrep 提交的行。【参考方案3】:一种 grep 解决方案是将输出通过管道传输到 grep 以仅打印与提交匹配的行:
git log -L 10,11:example.txt | grep 'commit \w' -A 4
grep 匹配每个日志条目的第一行,并使用 -A 标志打印接下来的 4 行
虽然有点冗长。很想听听是否有人有更好的解决方案!
【讨论】:
以上是关于git log -L 无差异的主要内容,如果未能解决你的问题,请参考以下文章