首页 > 解决方案 > 为什么 git log 输出重定向到 while 循环不起作用?

问题描述

我正在我的 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 log 可以打印输出,但第二个后跟 while 不会打印任何内容。为什么 ?

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

./check master a735c2f eb23992

如果我添加 --no-pager 选项,两者都不会打印。

我在 Fedora 28 上使用 bash 4.4.23(1)-release。

标签: bashgit

解决方案


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

' tformat:'

' tformat:' 格式的工作方式与 ' format:' 完全相同,只是它提供了“终结符”语义而不是“分隔符”语义。

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

这意味着单行格式的最终​​条目将正确地以新行结束,就像“单行”格式一样。例如:

$ 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

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

$ git log -2 --pretty=tformat:%h 4da45bef
$ git log -2 --pretty=%h 4da45bef

推荐阅读