Git 日志输出到 XML、JSON 还是 YAML?

     2023-02-23     295

关键词:

【中文标题】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","re​​fs","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 changedinsertionsdeletions 键/值。 引入了 impact 键/值,表示提交的累积更改 (insertions - deletions)。 清理双引号 ",将所有允许或由用户输入创建的值(如 subject)上的双引号转换为单引号 '。 几乎所有的pretty=format: 占位符都可用。 通过注释掉/取消注释可用的键/值,轻松包含/排除哪些键/值将被解析为JSON。 经过彻底注释的代码易于阅读。 控制台上的脚本执行反馈。 错误处理(因为需要正确设置存储库路径)。

成功,JSON被解析并保存。

错误 001:存储库路径不存在。

错误 002:存储库路径存在,但为空。

【讨论】:

超越xml和json:yam

...为Java开发者对YAML文件格式做一个高级介绍找出它与XML和JSON的不同之处并检验它的优越性和缺陷  所有动态语言(如RubyGroovyPython等)及其相关的框架(如Rubyonrails)百家争鸣尽管阅读本文的大部分Java开发者每天的大多数工作... 查看详情

git导出log日志记录到本地文件(代码片段)

git导出log日志记录到本地文件gitlog你的配置参数>./log.txt其中,命令后面的>./log.txt即为将控制台打印输出的内容导出到当前log.txt文件中,注意,这个时候git的控制台不会再有内容展示,需要不停按enter回车键... 查看详情

XML日志文件打印到漂亮[重复]

】XML日志文件打印到漂亮[重复]【英文标题】:XMLlogfileprintingtopretty[duplicate]【发布时间】:2021-10-1011:54:33【问题描述】:我正在尝试使用XML结构格式化输出文件。尝试了xml和lxml但现在没有运气。当前输出文件如下所示:<root>... 查看详情

JSON NSDictionary 在输出到日志时显示空描述

】JSONNSDictionary在输出到日志时显示空描述【英文标题】:JSONNSDictionaryshowingnulldescriptionwhenoutputtolog【发布时间】:2014-07-1720:59:37【问题描述】:我正在学习一些基本的php、SQL、JSON,以便我可以在我的iOS程序中使用数据库。在我... 查看详情

java里怎样将junit测试结果输出到日志

java里怎样将junit测试结果输出到日志  引用log4j的jar包,然后在日志的配置文件设置好日志输出级别,在需要输出日志的类中,定义Logger的实例。如:Logger logger=Logger.getLogger(this.getClass());logger.debug("Test");参考技术ALoggerlogger=Logg... 查看详情

nlog输出日志到azureblob存储

针对.NetFramework的日志,还是选择NLog比较好,方便,.Netcore选择Serilog更好,本文记录下NLog日志输出到AzureBlob存储。第一步:引用Nuget包<packageid="NLog"version="4.7.15"targetFramework=" 查看详情

日志级别

...有四种,级别从低到高分别是:debug->info->error->fatel.日志输出的时候,只会输出大于等于该级别的日志,也就是设置了INFO之后,DEBUG是不会被输出,只会输出INFO、ERROR和FATAL级别的日志.但即使日志关闭了,日志的语句还是会被执行... 查看详情

.net6 asp:在容器内运行时,默认输出日志格式为 json

】.net6asp:在容器内运行时,默认输出日志格式为json【英文标题】:.net6asp:Defaultoutputlogsareformattedasjsonwhenruninsidecontainer【发布时间】:2021-11-2508:44:17【问题描述】:我刚刚将我的aspwebapi项目从net5升级到net6,而没有触及任何代码... 查看详情

springboot在docker中无法输出日志到logstash

参考技术A在搭建了基于docker的ELK日志系统后,使用springboot(其实和什么开发的无关)开发webapp,作为container运行在docker容器里,写入Logstash失败,但是本机运行调试的日志都可以写入。因为docker的日志似乎必须使用dockerlogs指令... 查看详情

slf4j-logback日志以json格式导入elk

同事整理的,在此分享。logback,log4j2等slf4j的日志实现都可以以json格式输出日志,这里采用的是logback。当然也可以以文本行的格式输出,然后在logstash里通过grok解析,但是直接以json格式输出,在logstash处理时效率会高一点。Logb... 查看详情

slf4j日志只输出到控制台,没输出到日志文件

最近使用SLF4J遇到了一个比较头疼的坑,日志输出到控制台没有问题,但是始终没有输出到日志文件。无论怎麽修改日志配置,始终是老样子。有一种绝望,是各种百度、google却还是解决不了问题。。直到我在启动项目的时候发... 查看详情

将日志输出到docker容器外

...dockerlogs命令查看Docker容器内部应用程序运行时所产生的日志,可以免除首先进入Docker容器,再打开应用程序的日志文件的过程。dockerlogs会监控容器中操作系统的标准输出设备(STDOUT),一旦STDOUT有数据产生,就会将这些数据传... 查看详情

springboot日志输出到logstash,logstash端没有日志输出,为啥?

...ppender"><destination>x.x.x.x:4560</destination><!--日志输出编码--><encodercharset="UTF-8"class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"><providers><timestamp><timeZone>UTC</timeZone>< 查看详情

springboot输出日志到文件配置

新建logback-spring.xml,内容如下:<?xmlversion="1.0"encoding="UTF-8"?><configurationscan="true"scanPeriod="60seconds"><propertyname="ENCODER_PATTERN"value="%d{yyyy-MM-ddHH:mm:ss.SSS}[%thread]%- 查看详情

git版本回退

...史记录,在Git中,我们用gitlog1.gitlog主要用来查看当前的日志,不太方便查看,当需要回退到指定版本的时候,仅需要7位版本号,gitlog输出日志如下:2.gitreflog,这个命令是简洁版日志输出,很有用<小贴士:>为什么commitid需 查看详情

PHP JSON 或数组到 XML

...我走上正轨。这是我必须以某种方式建立自己的东西吗?还是有类似json_encode/json_decode的东西,它会接受一个数组或json对象,然后将其作为xml对象弹 查看详情

logback.xml的使用,将日志异步保存到数据库中

想要把日志异步保存到数据库中,首先需要创建一个数据库,然后创建三张固定的表:https://github.com/xiaorenwu-dashijie/logback.git<?xmlversion="1.0"encoding="UTF-8"?><configurationdebug="true"><!--定义日志文件的存储地址勿在LogBack的配置... 查看详情

Scrapy - 输出到多个 JSON 文件

】Scrapy-输出到多个JSON文件【英文标题】:Scrapy-OutputtoMultipleJSONfiles【发布时间】:2015-12-2811:59:48【问题描述】:我对Scrapy还是很陌生。我正在研究使用它来抓取整个网站的链接,我会将这些项目输出到多个JSON文件中。所以我可... 查看详情