【发布时间】:2011-06-03 18:44:37
【问题描述】:
这是一个非常简单的问题:作为一个 Git 新手,我想知道是否有办法将我的 git 日志输出到文件中,最好是某种序列化格式,如 XML、JSON 或 YAML。有什么建议吗?
【问题讨论】:
标签: git file logging version-control io
这是一个非常简单的问题:作为一个 Git 新手,我想知道是否有办法将我的 git 日志输出到文件中,最好是某种序列化格式,如 XML、JSON 或 YAML。有什么建议吗?
【问题讨论】:
标签: git file logging version-control io
输出到文件:
git log > filename.log
指定一种格式,就像您希望所有内容都在一行中
git log --pretty=oneline >filename.log
或者你希望它是一种通过像 sendmail 这样的程序通过电子邮件发送的格式
git log --pretty=email |email-sending-script.sh
要生成 JSON、YAML 或 XML,看起来您需要执行以下操作:
git log --pretty=format:"%h%x09%an%x09%ad%x09%s"
这个要点(不是我的)完美地格式化了 JSON 格式的输出: https://gist.github.com/1306223
另见:
【讨论】:
%b 或%B,您也可以使用%N 获取任何提交说明。您还必须弄清楚如何逃避换行符。 Fwiw 就我的目的而言,提交消息的第一行总是足够的。如果您真的想对提交消息(和补丁,就此而言)进行全文搜索,也许您应该查看使用 Solr 索引您的 Git 日志,如下所述:garysieling.com/blog/…
git log --numstat 的“文件已更改”数据的 JSON 输出。另外还有一些注意事项:首先,如果您担心在提交消息中转义特殊字符,请在格式字符串中使用 %f 而不是 %s。其次,只要您键入git help log,就会显示“格式代码”。它们列在“占位符”标题下(如果您不知道如何搜索 Git 帮助页面,这很容易:只需按 / 键,输入“占位符”,然后按回车键)。
我做了这样的事情来创建一个最小的 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^@^},\'';
然后(在 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);
}
结果是不错的 JSON,不会被引号打断。
【讨论】:
%f 而不是%s:%f: sanitized subject line, suitable for a filename
此脚本包装 git log 并生成 JSON 输出:https://github.com/paulrademacher/gitjson
【讨论】:
我在 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"
标题名称:
"commit","tree","parent","refs","subject","body","author","commiter"
必须与数据字段同步:
--pretty=format:'%H|%T|%P|%D|%s|%b|%an|%cn;'
见prettyformat docs。
我选择管道 | 作为分隔符。我冒着风险,它没有在提交消息中使用。我使用分号 ; 作为每次提交的分隔符。我当然应该选择别的东西。您可以尝试编写一些聪明的正则表达式来匹配并检查您的分隔符是否在提交消息中使用。或者你可以编写更复杂的正则表达式来匹配分割点或code a powershell scriptblock to define the split。
代码中最难弄清楚的一行是。
prettyGitLogDump.Replace("; ",';') -split ";", 0, "multiline"
You have to set option multiline 因为消息中可能存在 CR/LF,然后拆分停止 - 如果给出拆分的 nr,您只能设置多行。因此第二个参数值 0 表示全部。
(Replace("; ",';') 只是一个技巧,我在第一次提交后得到一个空格。所以我在提交分隔符后删除了空格。可能有更好的解决方案。)
无论如何,我认为这对于希望从 git 获取日志以查看谁提交以及为什么提交的 windows 用户或 powershell 粉丝来说可能是一个可行的解决方案。
【讨论】:
看,https://github.com/dreamyguy/gitlogg,您将永远需要的最后一个 git-log => JSON 解析器!
Gitlogg 的一些功能包括:
git log 解析为一个JSON 文件。repository键/值。files changed、insertions 和 deletions 键/值。impact 键/值,表示提交的累积更改 (insertions - deletions)。",将所有允许或由用户输入创建的值(如 subject)上的双引号转换为单引号 '。pretty=format: 占位符都可用。JSON。【讨论】: