好的,我放弃了,我是一个Bash noob。
此:
$ git log --no-walk --oneline 6980e6ecede8e188f434f6da669c2297f28decfe 458567536c1f20498da033cb0e42da74439ef12e
打印:
4585675 NNN bethDataFiles, allBethFiles belong to game/game/constants.py
6980e6e NNN bethDataFiles, allBethFiles belong to game/game/constants.py
此:
git log -g --pretty=format:'%ai %H' | awk '$0 >= "2016-04-13" && $0 <= "2016-04-15"'| cut -d' ' -f 4 | awk '!a[$0]++' | tr '\n' ' '
打印出一系列提交:
ba4ee4b099d23642e6cad56d9f41974f6e767781 1daaede0f4e11cae0e0bb00b9ebb43bba4f5671 ...
现在为什么要将此命令传递给git log,如下所示:
git log -g --pretty=format:'%ai %H' | awk '$0 >= "2016-04-13" && $0 <= "2016-04-15"'| cut -d' ' -f 4 | awk '!a[$0]++' | tr '\r\n' ' ' | git log --format='%h %s %ai' --no-walk
只显示第一次提交:
ba4ee4b _load_active_plugins pre BAPI code - superseded by games.py API: 2016-04-14 19:38:41 +0200
$ git --version
git version 2.6.1.windows.1
答案 0 :(得分:4)
git log
不读取stdin的任何输入。
尝试echo "abcd123" | git log --no-walk
,你会注意到
git log
将忽略标准输入。它将查找指定为参数的提交哈希,但没有。
因此,它将使用默认的HEAD,并在当前分支上打印最新的提交。
要打印提交范围,您可以执行以下操作:
如果您知道第一个和最后一个提交哈希:
git log abcd123..4567abc
如果您知道时间间隔:
git log --since="10 days ago" --until="5 days ago"
或者如果您知道具体日期:
git log --since="2016-04-13" --until="2016-04-15"
答案 1 :(得分:2)
git log --format='%h %s %ai' --no-walk \
$(git log -g --pretty=format:'%ai %H' \
| awk '$0 >= "2016-04-13" && $0 <= "2016-04-15"'\
| cut -d' ' -f 4 | awk '!a[$0]++' | tr '\r\n' ' '
)
或略好一点
git log -g --pretty=format:'%ai %H' | \
awk '$0 >= "2016-04-13" && $0 <= "2016-04-15"' |\
cut -d' ' -f 4 | awk '!a[$0]++' | \
xargs git log --format='%h %s %ai' --no-walk
但我想知道为什么你不想使用git log的--since
和--until
选项?
答案 2 :(得分:2)
有一个使用bash和Unix实用程序的通用表单:
... | ... | ... | xargs cmd
(xargs
在插入stdin作为参数后根据需要多次运行cmd
,或者:
cmd $(... | ... | ...)
运行管道,然后将其输出作为参数提供给cmd
。
但是,对于git log
,您不需要此项,因为它接受--stdin
以使其从标准输入读取修订ID。
我认为我们可以简化您的管道(顺便说一句,我没有意识到某些版本的awk知道如何直接比较日期;旧的awk没有):
git log -g --pretty=format:'%ai %H' | \
awk '$0 >= "2016-04-13" && $0 <= "2016-04-15"' | \
cut -d' ' -f 4 | awk '!a[$0]++' | tr '\n' ' '
我们希望修订版每行一个,因此不需要tr
。我们还可以使用原始awk来检查哈希ID的唯一性。所以:
git log -g --pretty=format:'%ai %H' | \
awk '$0 >= "2016-04-13" && $0 <= "2016-04-15" && !a[$4]++' | \
git log --no-walk --stdin
顺便说一句,这只是因为git log -g
执行了一次reflog walk(可能会产生重复的哈希),我们需要关联数组a
来丢弃重复哈希值。