以下命令在控制台上输出以下文本行
git log --pretty=format:"%h;%ai;%s" --shortstat
ed6e0ab;2014-01-07 16:32:39 +0530;Foo
3 files changed, 14 insertions(+), 13 deletions(-)
cdfbb10;2014-01-07 14:59:48 +0530;Bar
1 file changed, 21 insertions(+)
5fde3e1;2014-01-06 17:26:40 +0530;Merge Baz
772b277;2014-01-06 17:09:42 +0530;Qux
7 files changed, 72 insertions(+), 7 deletions(-)
我有兴趣有上述格式显示这样
ed6e0ab;2014-01-07 16:32:39 +0530;Foo;3;14;13
cdfbb10;2014-01-07 14:59:48 +0530;Bar;1;21;0
5fde3e1;2014-01-06 17:26:40 +0530;Merge Baz;0;0;0
772b277;2014-01-06 17:09:42 +0530;Qux;7;72;7
这将在一些可以解析分号分隔值的报告中使用。问题是文本"\n 3 files changed, 14 insertions(+), 13 deletions(-)"
(包含新行)被转换为3;14;13
(没有新行)一个可能的角落情况是像"5fde3e1;2014-01-06 17:26:40 +0530;Merge Baz"
这样的文本没有这样的行。在这种情况下,我需要;0;0;0
总的来说,目标是分析一段时间内的文件更改统计信息。我阅读了git log文档,但找不到任何可以帮助我以这种格式呈现的格式。我想到的最好的是上面提到的命令。
因此,任何可以生成预期格式的命令或shell脚本都将有很大的帮助。
谢谢!
8条答案
按热度按时间xzabzqsa1#
这将显示如下内容:
htrmnn0y2#
不幸的是,仅使用
git log
无法实现这一点。人们必须使用其他脚本来补偿大多数人没有意识到的东西:一些提交没有统计数据,即使它们不是合并。我一直在做一个将
git log
转换为JSON
的项目,为了完成它,我必须做你需要做的事情:在一行中获取每个提交和统计信息。该项目名为Gitlogg,欢迎您根据自己的需要进行调整:https://github.com/dreamyguy/gitlogg下面是Gitlogg的相关部分,这将使您接近您想要的内容:
请注意,我使用了制表符(
\t
)来分隔字段,因为;
可以用于提交消息。这个脚本的另一个重要部分是每行必须以一个唯一的字符串开始(在本例中是commits)。这是因为我们的脚本需要知道行从哪里开始。事实上,
git log
命令之后的任何内容都是为了补偿某些提交 * 可能没有stats* 的事实。但我突然想到,你想要实现的是以一种你可以可靠消费的格式整齐地输出提交。Gitlogg是完美的!它的一些特点是:
git log
解析为一个JSON
文件。repository
**键/值。files changed
、insertions
和deletions
**键/值。impact
**键/值,表示提交的累积更改(insertions
-deletions
)。"
,将所有允许或由用户输入创建的值(如subject
)转换为单引号'
。pretty=format:
占位符都可用。JSON
。x1c 0d1x成功,解析并保存JSON。
错误001:到存储库的路径不存在。
错误002:存储库路径存在,但为空。
dgsult0t3#
结合上面的所有答案,这里是我的2美分,以防有人正在寻找:
然后将其保存到
git-logs-into-csv.sh
文件中,或者只是复制/粘贴到控制台。我认为这是相对自我解释,但以防万一:
--all
从所有分支获取日志--since
限制了我们想要查看的提交数量--shortstat
-了解在提交中做了什么beq87vna4#
git不支持纯--格式的stat信息,这很遗憾:(但很容易将其脚本化,这是我的快速和肮脏的解决方案,应该是相当可读的:
我敢肯定,它可以更好地脚本,但嘿-它的快速和肮脏;)
用法:
请注意,您指定的格式不是防弹的。分号可以出现在commit summary中,这将打破该行中字段的数量-您可以将summary移动到行尾或以某种方式转义它-您希望如何做到这一点?
wwodge7n5#
这是
awk
的一种方法。对于给定的输入,它返回:
仍然不适用于像
5fde3e1;2014-01-06 17:26:40 +0530;Merge Baz
这样后面没有3 files changed, 14 insertions(+), 13 deletions(-)
的行。yhuiod9q6#
跟踪@user2461539将其解析为列。也适用于更复杂的cols,如“Subject”。请自行选择合适的分隔符。目前需要削减主题行,因为它会截断其他列时,它溢出。
nx7onnlm7#
我在
~/.bashrc
中写了这样的代码:其中
git-lgs
的参数是要显示日志的文件名。pexxcrt28#
将日志输出格式化为制表符分隔的格式,以便更容易解析,包括shortstat,然后通过
awk
管道输出并重新排列它:说明
格式化字符串
commit
awk要查找的文字字符串%x09
制表符的十六进制代码。(这里的Tabs are added with%x09
是为了避免复制粘贴问题,但是你可以使用`ctrl-v+tab在你的终端中插入文本制表符)%H
sha1%x09
选项卡%cI
iso格式提交日期%x09
选项卡%sd"
提交摘要Awk参数
-v FS="\t"
将字段分隔符更改为制表符Awk命令
/^commit/ { commit=$2; timestamp=$3; summary=$4 }
在提交行被消耗时被触发,并将字段2、3和4分配给命名变量/^ [0-9]+ files? changed/
{
是要在该匹配上运行的内容的开始stats=$1;
将第一个字段(整个stat行)分配给命名变量stats
,分号结束语句printf "https://github.com/timabell/gitopolis/commit/%s\t%s\t%-55s\t\"%s\"\n", commit, timestamp, stats, summary'
输出格式化行%s
从变量列表中插入字符串%-52s
填充字符串,使所有内容都排列得很好\t
插入一个制表符(比空格对齐更好,也更容易被进一步的工具解析)\"
转义引号,以便我们引用摘要\n
换行符开始输出中的下一条记录}
是要在该匹配上运行的内容的结尾示例
shortstat输出
awk输出