只显示git log中的sha1值

66

我想编写一个 Bash 脚本,循环遍历由 git log 命令输出的提交 sha1 值。但是,git log 输出了比我想要的更多的内容:

commit 0375602ba2017ba8750a58e934b41153faee6fcb
Author: Mark Amery <markamery@notmyrealemail.com>
Date:   Wed Jan 1 21:35:07 2014 +0000

    Yet another commit message

    This one even has newlines.

commit 4390ee9f4428c84bdbeb2fed0a461099a6c81b39
Author: Mark Amery <markamery@notmyrealemail.com>
Date:   Wed Jan 1 21:30:19 2014 +0000

    Second commit message.

commit bff53bfbc56485c4c1007b0884bb1c0d61a1cf71
Author: Mark Amery <markamery@notmyrealemail.com>
Date:   Wed Jan 1 21:28:27 2014 +0000

    First commit message.

如何让git log只输出sha1码,以便我可以方便地循环遍历它们?

4个回答

109

你可以使用 --format 参数来使用一个自定义格式,只包含 sha1:

git log --format=format:%H

以上命令的输出如下:

0375602ba2017ba8750a58e934b41153faee6fcb
4390ee9f4428c84bdbeb2fed0a461099a6c81b39
bff53bfbc56485c4c1007b0884bb1c0d61a1cf71

你可以像这样在Bash中循环遍历提交哈希值:
for sha1 in $(git log --format=format:%H); do
    : # Do something with $sha1
done

这比 使用 git rev-list 多了一些冗余,但如果您想要使用未被 git rev-list 支持的 git log 的排序或过滤参数,例如 -S,那么这可能是您唯一的选择。


你也可以使用xargs处理多行输出,而不是使用for循环。 - thisgeek
2
为什么要使用--format=format:%H而不是简单的--format=%H - bloody

45

一个替代 git log --format 的选择是 git rev-list 命令。对于脚本编写来说,它是推荐的选择,因为接口可以被依赖为稳定的(尽管像这样简单的用法,我会感到惊讶如果 git log 不足够稳定)。

for sha1 in $(git rev-list HEAD) ; do
    : # Do something with $sha1
done

2

你可以直接这样做

git rev-list HEAD -N

获取最近N个提交的SHA。

e.g.,

$ git rev-list HEAD -1
d9f89f4d16663d5012e5c09495f3b30ece3d2362

2

如果您只想查看最新的内容

git rev-list HEAD | head -1

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