从git rev-list格式中排除“Exclude Preceding Commit”行

21

我正在尝试编写一个分支差异命令,并且已经让它完全正常运行... 除了格式。 我可以使用--pretty=oneline来显示我想要的信息,但它会显示完整的哈希值,并且不会给输出加上颜色。

所以它只会输出这个:

fa73c05913292fbce940075fc8f454bad5066666 Example Commit Message
de4dbeffa249393dddebb7b13ae555cb97cad5be Another Example Commit Message
如果我尝试使用自定义格式字符串,例如:--pretty="format:%C(yellow)%h%C(reset) %s",它可以工作,但是还会显示一个额外的行在其上面。
例如。
commit >fa73c05913292fbce940075fc8f454bad5066666
fa73c05 Example Commit Message
commit >de4dbeffa249393dddebb7b13ae555cb97cad5be
de4dbef Another Example Commit Message
有没有办法让 git rev-list 输出格式时不包含前面的commit > abcdef3 ...行?

2
git rev-listgit log 本质上是相同的命令,除了输出格式和 git log 如果没有给定起始点将从 HEAD 开始。因此,在这里使用 git log --format=... <additional rev-list arguments> 就可以解决问题。 - torek
1
你到底想让这个“branch diff command”做什么?可能已经作为git众多的瑞士军刀之一提供了(没有手掌护卫)... - torek
@torek 哈哈,这绝对是git众多工具的准确描述。你完全正确。我感觉自己像个白痴,没有直接使用这个命令:git log --pretty="format:..." branch-name.. 这正是我想要的。列出分支之间不同的提交记录列表。不知道为什么我之前一直在使用rev-list - Brandon Anzaldi
2
听起来你可能需要使用 git cherry 和/或者通过 r1...r2 计算的“对称差集”。例如,git log --oneline --left-right --cherry-mark A...B(注意三个点,参见 gitrevisions(7))。 - torek
4
这仍然没有回答这个问题:你是否真的想使用rev-list而不仅仅是log - Mick Byrne
显示剩余3条评论
4个回答

11

为后来者留下答案。

@torec 在他的评论中提到了以下内容:

git rev-listgit log 实际上是相同的命令。

答案是使用以下格式:

# print out the log history in the desired format.
git log --pretty="format:..." <SHA-1>

9
如果我尝试使用自定义格式字符串,例如:--pretty="format:%C(yellow)%h%C(reset) %s",它可以工作,但它还会显示一个额外的行在它上面。
实际上...随着Git 2.33(2021年第三季度),"git rev-list"(man)学会了使用--no-commit-header选项从输出中省略commit <object-name>头行。
请参见提交d1c5ae7(2021年7月11日)由brian m. carlson (bk2204)(由Junio C Hamano -- gitster --提交fe3fec5中合并,于2021年7月22日)

rev-list:添加选项使--pretty=format无需头部信息

署名:Brian M. Carlson

通常情况下,我们鼓励用户在编写脚本时使用管道命令(例如git rev-list(man)),而不是面向用户的命令(例如git log(man))。

然而,git rev-list存在一个明显的问题,它会在使用自定义格式的--pretty选项时,始终打印包含“commit”和对象ID的行。

这使得它在许多脚本方案中不适用,强制用户改用git log

虽然为了向后兼容性我们不能更改此行为,但我们可以添加一个选项来取消此行为,因此让我们这样做,并称其为"--no-commit-header"。 此外,添加对应的正选项以重新启用它。

请注意,此选项不影响内置格式,只影响自定义格式。
这与用户从git log中已经具有的完全相同,也是大多数用户将习惯的行为。

rev-list-options现在包括在其man页面中:

--no-commit-header

取消打印指定格式之前包含“commit”和对象ID的头部信息行。这对内置格式没有影响;仅对自定义格式生效。

--commit-header

覆盖之前的--no-commit-header选项。


7
很遗憾,实际上没有可行的方法来完成这个任务。 git rev-list 是这样实现的:thusly
    if (revs->abbrev_commit && revs->abbrev)
        fputs(find_unique_abbrev(&commit->object.oid, revs->abbrev),
              stdout);
    else
        fputs(oid_to_hex(&commit->object.oid), stdout);

因此,无论您输入什么选项,git rev-list始终会打印某种提交哈希值。


4

在 git rev-list 后使用 sed,可以删除所有以 commit 开头的行。

git rev-list --pretty=format:"%C(yellow)%h%C(reset) %s" | sed '/^commit [0-9a-f]\{40\}$/d'


既然已经有一篇被接受的答案,而且它已经有将近4年的历史了,那么它有什么问题呢?既然你要发布一个新的答案? - Lasse V. Karlsen
1
原始的被接受的答案没有任何问题。这是另一种方法。在寻找问题的答案时偶然发现了这个问题,我认为我可以提供另一种解决方法。有些人可能必须使用git rev-list而不是git log来解决某些问题。 - Julien Bourdon
@LasseV.Karlsen 原始答案回答了一个不同的问题。 - CervEd

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