我正在创建一个 shell 脚本,用于显示 git 存储库最后 5 次 git 提交的提交 ID。
脚本文件的名称:'git_commit.sh' 我所说的“提交 ID”是指完整的 40 个字符的十六进制字符串。 我所说的 git 存储库是指当前分支。
我期望的输出:
yossi@hostname$ bash git_commit.sh | cat -e
42dfd4bdba4646b28136c4b0d71f76ae352aac10$
63a7f8e9e7f5ab2f29c4227440d78fc731201b89$
57361b98c8cb9041759461093ed38b7b8930e12e$
a05251da02f6c677f38f3ab68c95b2dd8812a822$
d17402aa3e3835e1b9e444482cda233e97e032d6$
yossi@hostname$
在'git_commit.sh'中插入的命令:
git log -5 --pretty="format:%H"
这是运行脚本时得到的输出:
yossi@hostname$ bash git_commit.sh | cat -e
42dfd4bdba4646b28136c4b0d71f76ae352aac10$
63a7f8e9e7f5ab2f29c4227440d78fc731201b89$
57361b98c8cb9041759461093ed38b7b8930e12e$
a05251da02f6c677f38f3ab68c95b2dd8812a822$
d17402aa3e3835e1b9e444482cda233e97e032d6yossi@hostname$
问题
这意味着当它通过管道传输到“cat -e”命令时,在第五个也是最后一个提交 ID 之后没有换行符。
我彻底查看了“git log”的手册页,但找不到任何解释该行为的内容。
我测试过的替代方案 我测试了通过以下三个命令替换
git log -5 --pretty="format:%H"
:
git log -5 --format="%H" | cat -e
git log -5 --pretty="tformat:%H" | cat -e
git log -5 --pretty="%H" | cat -e
“git_commit.sh”中插入的这三个替代命令中的每一个都提供了预期的输出:
yossi@hostname$ bash git_commit.sh | cat -e
42dfd4bdba4646b28136c4b0d71f76ae352aac10$
63a7f8e9e7f5ab2f29c4227440d78fc731201b89$
57361b98c8cb9041759461093ed38b7b8930e12e$
a05251da02f6c677f38f3ab68c95b2dd8812a822$
d17402aa3e3835e1b9e444482cda233e97e032d6$
yossi@hostname$
有人能够解释
git log -5 --pretty="format:%H"
的行为差异吗?
解释在这里:
•
:tformat
格式的工作方式与tformat:
完全相同,只不过它提供“终止符”语义而不是“分隔符”语义。换句话说,每个提交都附加了消息终止符(通常是换行符),而不是在条目之间放置分隔符。这意味着单行格式的最终条目将以新行正确终止,就像“oneline”格式一样。例如:format:
请注意,
git log --format="%H"
和git log --pretty="%H"
都相当于--pretty="tformat:%H"
:
--pretty[=<format>]
--format=<format>
以给定格式漂亮打印提交日志的内容,其中可以是<format>
、oneline
、short
、medium
、full
、fuller
、reference
之一,、raw
和format:<string>
。当tformat:<string>
不是以上任何一种,并且其中有<format>
时,它的作用就像给出了%placeholder
一样。--pretty=tformat:<format>
https://git-scm.com/docs/git-log#Documentation/git-log.txt---prettyltformatgt