为什么git log输出重定向到while循环不起作用?

时间:2019-12-26 05:22:20

标签: bash git

我正在bash shell脚本中尝试以下命令:

git log --oneline --no-decorate  --pretty=format:"%s" $oldrev..$newrev

git log --oneline --no-decorate  --pretty=format:"%s" $oldrev..$newrev | while read -r line; do
    echo "$line"
done

第一个git日志可以打印输出,但是第二个git日志后面则不打印任何内容。为什么?

我这样调用我的脚本:(第二个和第三个参数传递给$ oldrev和$ newrev)

./check master a735c2f eb23992

如果我添加--no-pager选项,则两者都不会打印任何内容。

我在fedora 28上使用bash 4.4.23(1)-发行版。

1 个答案:

答案 0 :(得分:0)

您应该使用pretty=tformat而不是pretty=format

  

'tformat:'

     

tformat:”格式的工作方式与“ format:”完全相同,不同之处在于它提供了“终止符”语义而不是“分隔符”语义。

     

换句话说,每个提交都附加了消息终止符(通常是换行符),而不是在条目之间放置分隔符。

     

这意味着单行格式的最终​​输入将以换行符正确终止,就像“ oneline”格式一样。例如:

$ git log -2 --pretty=format:%h 4da45bef \
  | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/'
4da45be
7134973 -- NO NEWLINE

$ git log -2 --pretty=tformat:%h 4da45bef \
  | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/'
4da45be
7134973
     

此外,任何包含%的无法识别的字符串都将被解释为前面带有tformat:的字符串。
  例如,这两个是等效的:

$ git log -2 --pretty=tformat:%h 4da45bef
$ git log -2 --pretty=%h 4da45bef
相关问题