我正在尝试为JSON格式的文件夹输出GitHub历史记录,其中包含作者,日期,评论和受影响的文件(路径)。我可以使用以下命令完成所有操作但是文件:
git log --pretty=format:'{%n "commit": "%H" %n "author": "%aN <%aE>",%n "date": "%ad", %n "message": "%f" %n },' $@ | perl -pe 'BEGIN{print "["}; END{print "]\n"}' | perl -pe 's/},]/}]/' >log.json
要获取文件名--name-only可以与log命令一起使用,但我无法在JSON中将其作为数组或“文件”获得。我现在就在这里:
git log --name-only --pretty=format:'{%n "commit": "%H" %n "author": "%aN <%aE>",%n "date": "%ad", %n "message": "%f" %n },' $@ | perl -pe 'BEGIN{print "["}; END{print "]\n"}' | perl -pe 's/},]/}]/' >log.json
这会产生:
{
"commit": "GUID"
"author": "My name <my@email.com",
"date": "Mon May 29 15:42:58 2017 +0300",
"message": "commit comment"
},
/folder/subfolder/file.extention
/folder/file.extention
虽然我希望在commit中指定为JSON数组的文件:
{
"commit": "GUID"
"author": "My name <my@email.com",
"date": "Mon May 29 15:42:58 2017 +0300",
"message": "commit comment"
"files": [
"/folder/subfolder/file.extention"
"/folder/file.extention" ]
},
答案 0 :(得分:2)
这里的主要技巧是将文件列表与生成的行分开但--pretty=format:
参数。我建议缩进所有--pretty=format:
行,以便文件可以与^(\S.*)
正则表达式轻松匹配。
第二个技巧是从文件列表中的最后一项中删除,
并添加右括号。最后一项后跟一个空字符串,为了检测这种情况,您可以将整个输出作为单个字符串(-0777
)读取,并将其与,\n\n
正则表达式匹配。
相同的-0777
功能允许我们分别通过匹配[
和]
轻松插入开放^
和关闭$
。
最终我们最终得到以下命令:
git log --name-only --pretty=format:' {%n "commit": "%H",%n "author": "%aN <%aE>",%n "date": "%ad", %n "message": "%f", %n "files": [' $@ \
| perl -pe 's/^(\S.*)/ "$1",/' \
| perl -0777 -pe 's/^/[\n/; s/,\n\n/\n ]},\n/; s/,$/\n ]}\n]/'