我想写一个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以便我可以方便地循环它们?
答案 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