如何将一系列提交传递到 git 日志?
How do I pass a range of commits to git log?
好吧,我放弃了,我是一个Bash菜鸟。
这个:
$ 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 '[=13=] >= "2016-04-13" && [=13=] <= "2016-04-15"'| cut -d' ' -f 4 | awk '!a[[=13=]]++' | tr '\n' ' '
打印出一系列提交:
ba4ee4b099d23642e6cad56d9f41974f6e767781 1daaede0f4e11cae0e0bb00b9ebb43bba4f5671 ...
现在为什么要通过管道将此命令传送到 git 日志中:
git log -g --pretty=format:'%ai %H' | awk '[=15=] >= "2016-04-13" && [=15=] <= "2016-04-15"'| cut -d' ' -f 4 | awk '!a[[=15=]]++' | 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
git log --format='%h %s %ai' --no-walk \
$(git log -g --pretty=format:'%ai %H' \
| awk '[=10=] >= "2016-04-13" && [=10=] <= "2016-04-15"'\
| cut -d' ' -f 4 | awk '!a[[=10=]]++' | tr '\r\n' ' '
)
或稍好
git log -g --pretty=format:'%ai %H' | \
awk '[=11=] >= "2016-04-13" && [=11=] <= "2016-04-15"' |\
cut -d' ' -f 4 | awk '!a[[=11=]]++' | \
xargs git log --format='%h %s %ai' --no-walk
但我想知道你为什么不想使用 git log 的 --since
和 --until
选项?
git log
不从标准输入读取任何输入。
尝试做 echo "abcd123" | git log --no-walk
你会注意到
git log
将忽略标准输入。它将查找指定为参数的提交哈希,但有 none。
因此,它将使用默认的 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"
bash 和 Unix 实用程序有一个通用形式:
... | ... | ... | xargs cmd
(xargs
在插入标准输入作为参数后根据需要多次运行 cmd
),或者:
cmd $(... | ... | ...)
运行管道,然后将其输出作为参数提供给 cmd
。
然而,使用 git log
你不需要这个,因为它接受 --stdin
让它从标准输入读取修订 ID。
我认为我们可以简化您的管道(顺便说一句,我没有意识到某些版本的 awk 知道如何直接比较日期;旧版 awk 没有):
git log -g --pretty=format:'%ai %H' | \
awk '[=12=] >= "2016-04-13" && [=12=] <= "2016-04-15"' | \
cut -d' ' -f 4 | awk '!a[[=12=]]++' | tr '\n' ' '
我们希望每行一个修订,因此不需要 tr
。我们也可以使用原始的awk来检查hash ID的唯一性。所以:
git log -g --pretty=format:'%ai %H' | \
awk '[=13=] >= "2016-04-13" && [=13=] <= "2016-04-15" && !a[]++ { print }' | \
git log --no-walk --stdin
顺便说一下,只是因为 git log -g
进行了 reflog 遍历(这可能会产生重复的哈希值),我们需要关联数组 a
来丢弃重复的哈希值。
(根据 编辑,但仍未测试)
好吧,我放弃了,我是一个Bash菜鸟。
这个:
$ 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 '[=13=] >= "2016-04-13" && [=13=] <= "2016-04-15"'| cut -d' ' -f 4 | awk '!a[[=13=]]++' | tr '\n' ' '
打印出一系列提交:
ba4ee4b099d23642e6cad56d9f41974f6e767781 1daaede0f4e11cae0e0bb00b9ebb43bba4f5671 ...
现在为什么要通过管道将此命令传送到 git 日志中:
git log -g --pretty=format:'%ai %H' | awk '[=15=] >= "2016-04-13" && [=15=] <= "2016-04-15"'| cut -d' ' -f 4 | awk '!a[[=15=]]++' | 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
git log --format='%h %s %ai' --no-walk \
$(git log -g --pretty=format:'%ai %H' \
| awk '[=10=] >= "2016-04-13" && [=10=] <= "2016-04-15"'\
| cut -d' ' -f 4 | awk '!a[[=10=]]++' | tr '\r\n' ' '
)
或稍好
git log -g --pretty=format:'%ai %H' | \
awk '[=11=] >= "2016-04-13" && [=11=] <= "2016-04-15"' |\
cut -d' ' -f 4 | awk '!a[[=11=]]++' | \
xargs git log --format='%h %s %ai' --no-walk
但我想知道你为什么不想使用 git log 的 --since
和 --until
选项?
git log
不从标准输入读取任何输入。
尝试做 echo "abcd123" | git log --no-walk
你会注意到
git log
将忽略标准输入。它将查找指定为参数的提交哈希,但有 none。
因此,它将使用默认的 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"
bash 和 Unix 实用程序有一个通用形式:
... | ... | ... | xargs cmd
(xargs
在插入标准输入作为参数后根据需要多次运行 cmd
),或者:
cmd $(... | ... | ...)
运行管道,然后将其输出作为参数提供给 cmd
。
然而,使用 git log
你不需要这个,因为它接受 --stdin
让它从标准输入读取修订 ID。
我认为我们可以简化您的管道(顺便说一句,我没有意识到某些版本的 awk 知道如何直接比较日期;旧版 awk 没有):
git log -g --pretty=format:'%ai %H' | \
awk '[=12=] >= "2016-04-13" && [=12=] <= "2016-04-15"' | \
cut -d' ' -f 4 | awk '!a[[=12=]]++' | tr '\n' ' '
我们希望每行一个修订,因此不需要 tr
。我们也可以使用原始的awk来检查hash ID的唯一性。所以:
git log -g --pretty=format:'%ai %H' | \
awk '[=13=] >= "2016-04-13" && [=13=] <= "2016-04-15" && !a[]++ { print }' | \
git log --no-walk --stdin
顺便说一下,只是因为 git log -g
进行了 reflog 遍历(这可能会产生重复的哈希值),我们需要关联数组 a
来丢弃重复的哈希值。
(根据