我正在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)-发行版。
答案 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