在 git 中打印给定提交的提交消息

Posted

技术标签:

【中文标题】在 git 中打印给定提交的提交消息【英文标题】:Print commit message of a given commit in git 【发布时间】:2011-03-22 09:35:36 【问题描述】:

我需要一个管道命令来打印一个给定提交的提交消息 - 不多也不少。

【问题讨论】:

如果有人来这里寻找打印单行提交消息的方法,但不关心开头出现的哈希,则以下工作:git show -s --oneline <commit> 我们应该在哪里添加行来打印服务器机器中的提交消息?我的意思是哪个钩子文件? “管道”命令是什么意思? @BryanAsh git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain 【参考方案1】:

这不是“管道”,但它会完全按照您的意愿行事:

$ git log --format=%B -n 1 <commit>

如果你绝对需要一个“管道”命令(不知道为什么这是一个要求),你可以使用rev-list

$ git rev-list --format=%B --max-count=1 <commit>

尽管rev-list 除了提交消息之外,还会打印出提交 sha(在第一行)。

【讨论】:

非常适合我——但我使用 %s%b 而不是 %B(在 Linux 机器上) %B 是一个正确的说明符(至少在 Git 1.7.2 中,不确定何时添加)。 %B 是在 1.7.1 之后的某个时间添加的(可能在 1.7.1.1 中)。 确实是——显然是 Git 1.7.2。非常感谢! 你也可以使用:$ git log --format=%B -n 1 &lt;commit&gt; | cat - 这会给你提交消息并且没有提交sha,你可以“管道”它。我实际上将它用作我的 CI 脚本的一部分。【参考方案2】:

git showgit log 更像是一个管道命令,并且具有相同的格式选项:

git show -s --format=%B SHA1

【讨论】:

如果您只想要第一行(“主题”),请使用%s 而不是%B (我更喜欢这个而不是接受的“log”或“rev-list”答案,因为它是一个单提交操作,而不是一个限制为 1 个条目的列表。) @Rich 你这是什么意思? @CervEd - 我的意思是“log”和“rev-list”命令对提交列表进行操作,这里的其他答案将列表限制为长度 1。这是不必要的间接级别和使事情复杂化。 git 中的“log”操作有点像“let xs = [123]; for (x in xs) show(x) ”,但只做show(123) 更简单快捷。 我认为您是在假设 rev-list 有一个 max-count 选项,而 show 并不是 rev-list 正在遍历整个树或执行计算密集型的操作。但是你不能对基于公共 API 的内部工作做出这样的假设。 git show 是一个瓷器命令,没有深入挖掘,我假设它使用与 rev-list 完全相同的机制以及一大堆其他 user-friendly 操作来减慢它.瓷器命令未针对速度进行优化【参考方案3】:

没有管道,但我的 .gitconfig 中有这些:

lsum = log -n 1 --pretty=format:'%s'
lmsg = log -n 1 --pretty=format:'%s%n%n%b'

那是“最后的总结”和“最后的消息”。您可以提供提交以获取该提交的摘要或消息。 (我使用的是 1.7.0.5,所以没有 %B。)

【讨论】:

您可以将 -n 参数作为参数传递。因此,您可以让它返回最后 5 次提交,而不是只返回最后一次提交。这里需要修改 lsum = "!f() git log -n $1 --pretty=format:'%s'; ; f" lmsg = "!f() git log -n $1 --pretty=format :'%s%n%n%b'; ; f" 在这里找到它***.com/questions/7005513/… 你只需运行这个 git lsum 5【参考方案4】:

这将为您提供任何指定时间的所有消息的非常紧凑的列表。

git log --since=1/11/2011 --until=28/11/2011 --no-merges --format=%B > CHANGELOG.TXT

【讨论】:

【参考方案5】:

我开始使用

git show-branch --no-name <hash>

好像比

git show -s --format=%s <hash>

两者都给出相同的结果

我实际上写了一个小工具来查看我所有回购的状态。你可以在github找到它。

【讨论】:

只显示第一行 (%s),而不是整个提交消息(“不多不少”,正如提问者所写)。如果您有办法使用 %B 进行 show-branch,那将很有帮助。【参考方案6】:

我为此使用短日志:

$ git shortlog master..
Username (3):
      Write something
      Add something
      Bump to 1.3.8 

【讨论】:

【参考方案7】:

使用 git-rev-list 打印提交信息

git-rev-list 是让您打印提交消息的管道命令。

像这样使用它。

git rev-list --format=%B --max-count=1 <commit> | tail +2
--format=%B:显示消息(主题%s + %n%n + 正文%b--max-count=1:我们只对一个提交感兴趣 &lt;commit&gt;shaHEADbranch-nametag-namebranch1...branch2 等。 | tail +2: 第一行是commit sha,略过

git loggit show 快很多。

【讨论】:

这不适用于合并提交,尽管它有两个父节点:您必须使用 tail +3 @leponzo,无赖。也许最好使用某种 sed 魔法来可靠地摆脱 shas【参考方案8】:

在 git 中单独获取我的 Last Commit Message

git log --format=%B -n 1 $(git log -1 --pretty=format:"%h") | cat -

【讨论】:

以上是关于在 git 中打印给定提交的提交消息的主要内容,如果未能解决你的问题,请参考以下文章

git commit 在一行中打印出消息

在 Git 钩子中获取提交消息

如何在 git 中编辑任何提交的提交消息? [复制]

在 git 中提交消息前缀

如何在 git 中编辑不正确的提交消息(我已推送)?

在 git 中强制提交消息格式