git - 我可以在 git log 输出中转义字符吗?

标签 git

我想对 git log 的输出进行后期处理一直在玩 --pretty设置。当我例如做

--pretty=format:'{"sha":"%h","message":"%B","author":"%aN <%aE>","commit":"%cE","date":"%cD"}

我得到一些类似 JSON 的输出;当我输入 {}甚至是 "进入提交消息,这弄乱了我的输出。

有没有办法告诉git log转义那些字符,例如通过在前面加上 \

有两个类似的问题Git log output to XML, JSON or YAMLGit log output preferably as XML ,但它们都没有解决特殊字符的转义问题(例如,如果在 XML 情况下我将 <foo> 放入我的提交消息中,生成的 XML 将被破坏)。

最佳答案

转义字符串不是 Git 的工作; git log 没有任何东西可以帮助你做到这一点。要实现您的目标,您需要像 sed 这样的工具来为您编辑字符串。

试试这个(应该在大多数 shell 中工作,但我只检查了 Cygwin bash):

function escape_chars {
    sed -r 's/(\{\}")/\\\1/g'
}
function format {
    sha=$(git log -n1 --pretty=format:%h $1 | escape_chars)
    message=$(git log -n1 --pretty=format:%B $1 | escape_chars)
    author=$(git log -n1 --pretty=format:'%aN <%aE>' $1 | escape_chars)
    commit=$(git log -n1 --pretty=format:%cE $1 | escape_chars)
    date=$(git log -n1 --pretty=format:%cD $1 | escape_chars)
    echo "{\"sha\":\"$sha\",\"message\":\"$message\",\"author\":\"$author\",\"commit\":\"$commit\",\"date\":\"$date\"}"
}

for hash in $(git rev-list)
do
  format $hash
done

以上将转义{} 而不是\,尽管来自JSON.org \{\} 都是无效转义;只有 \" 需要转义。(将 sed 表达式替换为 sed -r 's/("\\)/\\\1/g' 用于真正的 JSON 输出。)

尽管 %cE 命令实际上给出了提交者的电子邮件地址,但我也保留了您示例中的“提交”值;我不确定这是否是您想要的。

(这现在包括 correct but rejected edit by macrobug 。谢谢!)

关于git - 我可以在 git log 输出中转义字符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9301673/

相关文章:

git - git 标签对象的格式是什么以及如何计算它的 SHA?

git - 无法通过 'docker attach'到达Bash Shell

git - 将 git 存储库推送到具有历史记录的远程颠覆

node.js - Heroku 上的第二个 Node 应用程序部署总是失败

git - 比较强制推送的 GitHub pull 请求的新旧版本

linux - 带有 git 和符号链接(symbolic link)的基于组件的 Web 项目目录布局

git - 如何为 Git 设置两个远程源?

GIT LFS(仅支持 application/vnd.git-lfs 和 application/vnd.git-lfs+json)

Git 不断复制文件并在文件名末尾附加 ' 2'

git - Hg/Git 存储库损坏问题有多大?