仅使用git log显示sha1

时间:2014-01-01 21:49:56

标签: git bash

我想写一个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只输出sha1s以便我可以方便地循环它们?

3 个答案:

答案 0 :(得分:68)

您可以将--format参数与仅包含sha1的custom format一起使用:

git log --format=format:%H

上述命令产生如下输出:

0375602ba2017ba8750a58e934b41153faee6fcb
4390ee9f4428c84bdbeb2fed0a461099a6c81b39
bff53bfbc56485c4c1007b0884bb1c0d61a1cf71

你可以像这样在Bash中循环提交哈希:

for sha1 in $(git log --format=format:%H); do
    : # Do something with $sha1
done

这比using git rev-list略微冗长,但如果您想使用git log不支持的git rev-list的排序或过滤参数,可能是您唯一的选择,例如{{ 1}}。

答案 1 :(得分:27)

git log --format替代git rev-list管道命令。出于脚本目的,它是推荐的选择,因为可以依赖接口保持稳定(尽管对于这样的简单用途,如果git log不够稳定,我会感到惊讶。)

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

答案 2 :(得分:1)

如果您只想查看最新的

git rev-list HEAD | head -1