在 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 <commit> | cat -
这会给你提交消息并且没有提交sha,你可以“管道”它。我实际上将它用作我的 CI 脚本的一部分。【参考方案2】:
git show
比git 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
:我们只对一个提交感兴趣
<commit>
:sha
、HEAD
、branch-name
、tag-name
、branch1...branch2
等。
| tail +2
: 第一行是commit sha,略过
比git log
或git 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 中打印给定提交的提交消息的主要内容,如果未能解决你的问题,请参考以下文章