Git日志输出到XML,JSON或YAML?

And*_*rew 40 git io version-control logging file

这是一个非常简单的问题:作为一个Git新手,我想知道是否有办法将我的git日志输出到文件,最好是某种序列化格式,如XML,JSON或YAML.有什么建议?

hun*_*tar 53

输出到文件:

git log > filename.log
Run Code Online (Sandbox Code Playgroud)

指定格式,就像你想要一行一样

git log --pretty=oneline >filename.log
Run Code Online (Sandbox Code Playgroud)

或者您希望通过sendmail等程序通过电子邮件发送格式

git log --pretty=email |email-sending-script.sh
Run Code Online (Sandbox Code Playgroud)

要生成JSON,YAML或XML,您需要执行以下操作:

git log --pretty=format:"%h%x09%an%x09%ad%x09%s"
Run Code Online (Sandbox Code Playgroud)

这个要点(不是我的)在JSON中完美地格式化输出:https: //gist.github.com/1306223

也可以看看:

  • 嘿,我是引用的要点的作者,然后说我已经添加了另一个shell脚本,它支持来自`git log --numstat`的"文件已更改"数据的JSON输出.还有其他一些注释:首先,**如果你担心在提交消息中转义特殊字符**,那么在格式字符串中使用`%f`而不是'%s`.其次,只要输入`git help log`,就会显示"格式代码".它们列在"占位符"标题下(如果您不知道如何搜索Git帮助页面很容易:只需按`/`键,键入"占位符"然后点击RETURN键). (5认同)
  • 这就像一个魅力,谢谢!对于未来的读者,这里是“format”使用的短代码的链接:http://www.kernel.org/pub/software/scm/git/docs/git-log.html (2认同)
  • 更直接的格式代码链接:http://www.kernel.org/pub/software/scm/git/docs/git-log.html#_pretty_formats (2认同)
  • @Heiko Rupp:要打印完整的提交消息,请使用 `%b` 或 `%B`,您也可以使用 `%N` 来获取任何提交注释。您还必须弄清楚如何逃避换行符。Fwiw 就我而言,提交消息的第一行总是足够的。如果你真的想对提交消息(和补丁,就此而言)进行全文搜索,也许你应该看看用 Solr 索引你的 Git 日志,如下所述:http://www.garysieling.com/blog/discovering-senior -来自源代码历史的开发人员 (2认同)

Tim*_*eau 12

我做了类似这样的事情来创建一个最小的web api/javascript小部件,它将显示任何存储库中的最后5个提交.

如果您使用任何类型的脚本语言执行此操作,那么您确实希望使用除"引号字符之外的其他内容生成JSON ,以便您可以在提交消息中转义实际引号.(你迟早得到它们,打破东西并不好.)

所以我最终得到了可怕的但不太可能的分隔符^@^和这个命令行.

var cmd = 'git log -n5 --branches=* --pretty=format:\'{%n^@^hash^@^:^@^%h^@^,%n^@^author^@^:^@^%an^@^,%n^@^date^@^:^@^%ad^@^,%n^@^email^@^:^@^%aE^@^,%n^@^message^@^:^@^%s^@^,%n^@^commitDate^@^:^@^%ai^@^,%n^@^age^@^:^@^%cr^@^},\'';
Run Code Online (Sandbox Code Playgroud)

然后(在node.js中)我的http响应主体是从这样stdout的调用构造的git log:

var out = ("" + stdout).replace(/"/gm, '\\"').replace(/\^@\^/gm, '"');
if (out[out.length - 1] == ',') {
    out = out.substring (0, out.length - 1);
}
Run Code Online (Sandbox Code Playgroud)

结果是不错的JSON,不会打破引号.


Pat*_*röm 5

我在 Powershell 中编写了这个来获取 git logdata 并将其保存为 json 或其他格式:

$header = @("commit","tree","parent","refs","subject","body","author","commiter") 
[string] $prettyGitLogDump= (git log MyCoolSite.Web-1.4.0.002..HEAD --pretty=format:'%H|%T|%P|%D|%s|%b|%an|%cn;') 
$gldata = foreach ($commit in $prettyGitLogDump.Replace("; ",';') -split  ";", 0, "multiline") {
          $prop = $commit -split "\|"
          $hash = [ordered]@{}
          for ($i=0;$i -lt $header.count;$i++) {$hash.add($header[$i],$prop[$i])} 
          [pscustomobject]$hash
}
$gldata |  ConvertTo-Json | Set-Content -Path "GitLog.json" 
Run Code Online (Sandbox Code Playgroud)

标题名称:

“提交”,“树”,“父级”,“参考文献”,“主题”,“正文”,“作者”,“提交者”

必须与数据字段同步:

--pretty=格式:'%H|%T|%P|%D|%s|%b|%an|%cn;'

请参阅Prettyformat 文档
我选择管道| 作为分隔符。我采取了一个风险,它没有在提交消息中使用。我用了分号; 作为每次提交的 sep。我当然应该选择别的东西。您可以尝试编写一些巧妙的正则表达式来匹配并检查提交消息中是否使用了分隔符。或者您可以编写更复杂的正则表达式来匹配分割点或编写 powershell 脚本块来定义 split

代码中最难理解的一行是。

PrettyGitLogDump.Replace("; ",';') -split ";", 0, "多行"

您必须设置选项多行,因为消息中可能存在 CR/LF,然后分割停止 - 如果给出了分割的 nr,则只能设置多行。因此第二个参数值 0 表示全部。

(替换(“;”,';')只是一个黑客,我在第一次提交后得到一个空格。所以我在提交分隔符后删除空格。可能有更好的解决方案。)

无论如何,我认为对于 Windows 用户或 powershell 粉丝来说,这可能是一个可行的解决方案,他们希望从 git 获取日志来查看谁进行了提交以及原因。