简体   繁体   中英

Can I escape chars in git log output?

I want to post process the output of git log and have been playing with the --pretty settings. When I eg do

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

I get some JSON-like output; when I put in a { or } or even a " into the commit message this messes up my output.

Is there a way to tell git log to escape those chars eg by prepending a \\ ?

There are two similar questions Git log output to XML, JSON or YAML and Git log output preferably as XML , but they both do not address the escaping of the special chars (eg if in the XML case I put <foo> in my commit message, the resulting XML will be broken).

Escaping strings isn't Git's job; git log doesn't have anything that'll help you do that. To achieve what you're after, you'll need something like sed to do the string editing for you.

Try this (should work in most shells, but I've only checked in 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

The above will escape { and } and not \\ , although from JSON.org both \\{ and \\} are invalid escapes; only \\ and " need to be escaped. (Replace the sed expression with sed -r 's/("\\\\)/\\\\\\1/g' for true JSON output.)

I've also left the "commit" value as it is in your example, although the %cE command actually gives the commiter's email address; I'm not sure if that's what you intended.

(This now includes a correct but rejected edit by macrobug . Thanks!)

我不知道如何只使用git log来完成这个,但是一个简单的其他解决方案是使用git log生成类似CSV的输出(使用制表符分隔的字段)并将此输出传递给python脚本,该脚本处理JSON生成与正确的报价。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM