如何将一系列提交传递给git log?

时间:2016-05-19 14:06:06

标签: git bash git-log

好的,我放弃了,我是一个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

3 个答案:

答案 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来丢弃重复哈希值。