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
也可以看看:
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,不会打破引号.
我在 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 获取日志来查看谁进行了提交以及原因。