GitHub历史记录为JSON,包含日期,名称注释和文件已更改

时间:2017-06-01 10:18:57

标签: json git

我正在尝试为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" ]
},

1 个答案:

答案 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]/'