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

ddhy6vgd  于 2023-02-17  发布在  Git
关注(0)|答案(6)|浏览(160)

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

63lcw9qa

63lcw9qa1#

输出到文件:

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
另见:

dgenwo3n

dgenwo3n2#

我做了一些类似的事情来创建一个最小的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响应主体从stdoutgit log的调用构建,这样:

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

结果是没有引号的漂亮JSON。

5n0oy7gb

5n0oy7gb3#

这个脚本 Package git log并产生JSON输出:https://github.com/paulrademacher/gitjson

wixjitnu

wixjitnu4#

我在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"

标题名称:
"提交","树","父级","引用","主题","正文","作者","提交者"
必须与数据字段同步:

  • -漂亮=格式:'% H|T百分比|%磷|% D|%秒|% b|百分比|% cn;'
    参见prettyformat docs
    我选择烟斗**|* * 作为分隔符。我正在采取一个risc,它不是用在提交消息中。我用分号**;* * 作为每个提交的分隔符。当然我应该选择其他的。你可以尝试编写一些聪明的正则表达式来匹配和检查提交消息中是否使用了分隔符。或者你可以编写更复杂的正则表达式来匹配分割点,或者编写一个powershell脚本块来定义分割。
    代码中最难理解的一行是。
    漂亮的GitLogDump。将(";",';')-拆分";",0,"多行"
    您必须设置选项multiline,因为消息中可能存在CR/LF,然后拆分停止-只有在给定拆分次数时才能设置multiline。因此,第二个参数值为0,表示全部。
  • (将(";",';')只是一个小问题,我在第一次提交后得到一个空格。所以我删除了提交分隔符后的空格。可能有更好的解决方案。)*

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

ttvkxqim

ttvkxqim5#

请看https://github.com/dreamyguy/gitlogg,您需要的最后一个git-log => JSON解析器!

Gitlogg的一些特性包括:

  • 多个存储库的git log解析为一个JSON文件
  • 引入了**repository**键/值。
  • 引入了**files changedinsertionsdeletions**键/值。
  • 引入了**impact**键/值,表示提交的累积更改(insertions-deletions)。
  • 通过将允许用户输入或由用户输入创建的所有值(如subject)上的双引号"转换为单引号'来净化双引号"
  • 几乎所有的pretty=format:占位符都可用。
  • 通过注解掉/取消注解可用的键/值,轻松地包括/排除将解析为JSON的键/值。
  • 易于阅读的代码,彻底注解。
  • 控制台上的脚本执行反馈。
  • 错误处理(因为需要正确设置存储库的路径)。

x1c 0d1x成功,解析并保存JSON。
错误001:存储库路径不存在。
错误002:存储库路径存在,但为空。

7fyelxc5

7fyelxc56#

git log没有提供转义引号,反斜杠,换行符等,这使得 * 健壮的 * 直接JSON输出不可能(除非你限制自己使用可预测内容的字段子集,例如hash & dates)。
但是,%w([width[,indent1[,indent2]]])说明符可以缩进行,从而可以对任意字段发出健壮的YAML!参数与git shortlog -w相同:
按宽度换行输出。每个条目的第一行缩进 * indent1 * 个空格,第二行和后续行缩进 * indent2 * 个空格。

  • 宽度 缩进1 * 和 * 缩进2 * 分别默认为76、6和9。

如果 * width * 为0(零),则缩进输出行而不换行。
保证缩进文本(不需要其他引号!)的可预测解析的YAML语法是YAML block literal,不折叠,有明确的空格数要去除,例如|-2

  • -选项去掉了尾随换行符,这在技术上是有损耗的--它失去了1和4个尾随换行符之间的区别,这是可以用git commit --cleanup=verbatim生成的--所以理论上你可能需要|+2来处理多行字段。

示例:

git log --pretty=format:'- hash: %H
  author_date: %aI
  committer_date: %cI
  author: |-2
    %w(0,0,4)%an <%ae>%w(0,0,0)
  committer: |-2
    %w(0,0,4)%cn <%ae>%w(0,0,0)
  message: |-2
    %w(0,0,4)%B%w(0,0,0)'

%w会影响后面的%占位符以及文字行,因此必须使用%w(0,0,0)重置缩进,否则类似committer:的文本也会缩进。
输出片段(在reconstructed unix history上):

- hash: 0d54a08ec260f3d554db334092068680cdaff26a
  author_date: 1972-11-21T14:35:16-05:00
  committer_date: 1972-11-21T14:35:16-05:00
  author: |-2
    Ken Thompson <ken@research.uucp>
  committer: |-2
    Ken Thompson <ken@research.uucp>
  message: |-2
    Research V2 development
    Work on file cmd/df.s
    
    Co-Authored-By: Dennis Ritchie <dmr@research.uucp>
    Synthesized-from: v2

- hash: 4bc99f57d668fda3158d955c972b09c89c3725bd
  author_date: 1972-07-22T17:42:11-05:00
  committer_date: 1972-07-22T17:42:11-05:00
  author: |-2
    Dennis Ritchie <dmr@research.uucp>
  committer: |-2
    Dennis Ritchie <dmr@research.uucp>
  message: |-2
    Research V2 development
    Work on file c/nc0/c00.c
    
    Synthesized-from: v2

注我没有在日期周围加上引号,以显示解析为原生YAML时间戳类型。支持可能会有所不同(特别是因为YAML v1. 2规范将时间戳和布尔值之类的东西委托给了依赖于应用程序的 * schema *?),因此将它们作为"字符串"可能会很实用...
要将YAML转换为JSON,可以通过yq或类似的工具。
或简短的就地脚本,例如

| ruby -e '
require "yaml"
require "json"
# to parse timestamps
require "date"
data = YAML.safe_load(STDIN.read(), permitted_classes: [Date, Time])
puts(JSON.pretty_generate(data))
'

相关问题