如何在无TTY环境下让Git输出原始标签注解而非单行打包内容?
如何在脚本中保留Git标签注解的原始格式?
我来帮你解决这个问题——你遇到的换行丢失问题,其实根源不是Git的输出,而是shell处理未加引号变量的默认行为,下面给你具体的解决方案和原因解释:
核心原因
当你用$(git tag -l --format '%(contents)' release-1.00)捕获命令输出时,Git其实已经输出了带换行的原始注解内容,但执行echo $MSG时,shell会把变量里的所有空白字符(包括换行、空格、制表符)都当成单词分隔符,自动替换成单个空格,最终输出就变成了一行。而在脚本外直接执行Git命令时,输出直接发送到终端,终端会正确解析换行,所以你能看到原始格式。
解决方案1:输出变量时添加双引号
这是最简单有效的方法,只要在引用变量时用双引号包裹,shell就会保留变量中的所有原始空白(包括换行):
MSG=$(git tag -l --format '%(contents)' release-1.00) # 一定要用双引号包裹变量 echo "$MSG"
执行这段脚本后,你就能看到和脚本外执行Git命令完全一致的多行注解内容了。
解决方案2:强制Git输出原始格式(特殊场景)
如果上面的方法不生效(比如Git在无TTY环境下自动调整了输出格式),可以通过以下方式强制Git保留原始换行:
# 方法A:禁用Git分页器,避免输出被调整 MSG=$(git --no-pager tag -l --format '%(contents)' release-1.00) echo "$MSG" # 方法B:设置环境变量,告知Git不需要适配终端 MSG=$(GIT_TERMINAL_PROMPT=0 git tag -l --format '%(contents)' release-1.00) echo "$MSG"
不过绝大多数情况下,第一种方法就足够解决问题了,因为变量里其实已经包含了换行,只是需要正确输出而已。
内容的提问来源于stack exchange,提问作者RickMeasham
相关产品推荐
相关产品推荐

