Git 日志输出到 XML、JSON 还是 YAML?
Posted
技术标签:
【中文标题】Git 日志输出到 XML、JSON 还是 YAML?【英文标题】:Git log output to XML, JSON, or YAML? 【发布时间】:2011-06-03 18:44:37 【问题描述】:这是一个非常简单的问题:作为一个 Git 新手,我想知道是否有办法将我的 git 日志输出到文件中,最好是某种序列化格式,如 XML、JSON 或 YAML。有什么建议吗?
【问题讨论】:
【参考方案1】:输出到文件:
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
另见:
http://git-scm.com/book/en/Git-Basics-Viewing-the-Commit-History Git how to save a preset git log --format How to parse the output of git log【讨论】:
这就像一个魅力,谢谢!对于未来的读者,这里是“格式”使用的短代码的链接:kernel.org/pub/software/scm/git/docs/git-log.html 嗯。好吧,我能找到的所有参考资料都指向同一个损坏的页面,所以对于谁在没有重定向的情况下取下 git 文档的人感到羞耻。嘘。 更多格式代码的直接链接:kernel.org/pub/software/scm/git/docs/… @Heiko Rupp:要打印完整的提交消息,请使用%b
或%B
,您也可以使用%N
获取任何提交说明。您还必须弄清楚如何逃避换行符。 Fwiw 就我的目的而言,提交消息的第一行总是足够的。如果您真的想对提交消息(和补丁,就此而言)进行全文搜索,也许您应该查看使用 Solr 索引您的 Git 日志,如下所述:garysieling.com/blog/…
嘿,我是引用要点的作者,顺便说我添加了另一个 shell 脚本,它支持来自git log --numstat
的“文件已更改”数据的 JSON 输出。另外还有一些注意事项:首先,如果您担心在提交消息中转义特殊字符,请在格式字符串中使用 %f
而不是 %s
。其次,只要您键入git help log
,就会显示“格式代码”。它们列在“占位符”标题下(如果您不知道如何搜索 Git 帮助页面,这很容易:只需按 /
键,输入“占位符”,然后按回车键)。【参考方案2】:
我做了这样的事情来创建一个最小的 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
FWIW,一个使用这种方法的项目is here
值得一提的是,您现在可以使用 ES6 模板字符串执行此操作,无需使用 ^@^ 分隔符和节点字符串替换。
@Gary 你能提供一个简短的例子来说明如何做到这一点吗?【参考方案3】:
此脚本包装 git log 并生成 JSON 输出:https://github.com/paulrademacher/gitjson
【讨论】:
【参考方案4】:我在 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 粉丝来说可能是一个可行的解决方案。
【讨论】:
【参考方案5】:看,https://github.com/dreamyguy/gitlogg,您将永远需要的最后一个 git-log => JSON
解析器!
Gitlogg 的一些功能包括:
将多个存储库的git log
解析为一个JSON
文件。
引入了repository
键/值。
引入了 files changed
、insertions
和 deletions
键/值。
引入了 impact
键/值,表示提交的累积更改 (insertions
- deletions
)。
清理双引号 "
,将所有允许或由用户输入创建的值(如 subject
)上的双引号转换为单引号 '
。
几乎所有的pretty=format:
占位符都可用。
通过注释掉/取消注释可用的键/值,轻松包含/排除哪些键/值将被解析为JSON
。
经过彻底注释的代码易于阅读。
控制台上的脚本执行反馈。
错误处理(因为需要正确设置存储库路径)。
成功,JSON被解析并保存。
错误 001:存储库路径不存在。
错误 002:存储库路径存在,但为空。
【讨论】:
以上是关于Git 日志输出到 XML、JSON 还是 YAML?的主要内容,如果未能解决你的问题,请参考以下文章