如何将一系列提交传递到 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 来丢弃重复的哈希值。

(根据 编辑,但仍未测试)