如何在一行中获得短统计的Git日志?

Ank*_*ush 22 git shell text-processing text-manipulation git-log

以下命令在控制台上输出以下文本行

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(-)
Run Code Online (Sandbox Code Playgroud)

我有兴趣让上面的格式像这样显示

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
Run Code Online (Sandbox Code Playgroud)

这将在某些报告中使用,该报告可以解析以分号分隔的值.事情是文本"\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日志文档,但找不到任何可以帮助我以这种格式呈现的格式.我提出的最好的是上面提到的命令.

因此,任何可以生成预期格式的命令或shell脚本都会有很大帮助.

谢谢!

Wal*_*rée 6

遗憾的是,这只能用于实现git log.必须使用其他脚本来补偿大多数人不知道的事情:某些提交没有统计信息,即使它们不是合并.

我一直致力于一个转换git logJSON并完成它的项目我必须做你需要的事情:用一行中的每个提交,统计数据.该项目名为Gitlogg,欢迎您根据需要进行调整:https://github.com/dreamyguy/gitlogg

以下是Gitlogg的相关部分,它将使您接近您想要的内容:

git log --all --no-merges --shortstat --reverse --pretty=format:'commits\tcommit_hash\t%H\tcommit_hash_abbreviated\t%h\ttree_hash\t%T\ttree_hash_abbreviated\t%t\tparent_hashes\t%P\tparent_hashes_abbreviated\t%p\tauthor_name\t%an\tauthor_name_mailmap\t%aN\tauthor_email\t%ae\tauthor_email_mailmap\t%aE\tauthor_date\t%ad\tauthor_date_RFC2822\t%aD\tauthor_date_relative\t%ar\tauthor_date_unix_timestamp\t%at\tauthor_date_iso_8601\t%ai\tauthor_date_iso_8601_strict\t%aI\tcommitter_name\t%cn\tcommitter_name_mailmap\t%cN\tcommitter_email\t%ce\tcommitter_email_mailmap\t%cE\tcommitter_date\t%cd\tcommitter_date_RFC2822\t%cD\tcommitter_date_relative\t%cr\tcommitter_date_unix_timestamp\t%ct\tcommitter_date_iso_8601\t%ci\tcommitter_date_iso_8601_strict\t%cI\tref_names\t%d\tref_names_no_wrapping\t%D\tencoding\t%e\tsubject\t%s\tsubject_sanitized\t%f\tcommit_notes\t%N\tstats\t' |
  sed '/^[ \t]*$/d' |               # remove all newlines/line-breaks, including those with empty spaces
  tr '\n' 'ò' |                     # convert newlines/line-breaks to a character, so we can manipulate it without much trouble
  tr '\r' 'ò' |                     # convert carriage returns to a character, so we can manipulate it without much trouble
  sed 's/tòcommits/tòòcommits/g' |  # because some commits have no stats, we have to create an extra line-break to make `paste -d ' ' - -` consistent
  tr 'ò' '\n' |                     # bring back all line-breaks
  sed '{
      N
      s/[)]\n\ncommits/)\
  commits/g
  }' |                              # some rogue mystical line-breaks need to go down to their knees and beg for mercy, which they're not getting
  paste -d ' ' - -                  # collapse lines so that the `shortstat` is merged with the rest of the commit data, on a single line
Run Code Online (Sandbox Code Playgroud)

请注意,我使用了tab字符(\t)来分隔;可能在提交消息上使用的字段.

这个脚本的另一个重要部分是每行必须以唯一的字符串开头(在这种情况下它是提交).那是因为我们的脚本需要知道线的开始位置.事实上,无论git log命令发生什么,都可以弥补一些提交可能没有统计数据的事实.

但令我感到震惊的是,你想要实现的是以一种你可以可靠消费的格式整齐地输出提交.Gitlogg非常适合!它的一些功能是:

  • 解析git log多个资源库到一个JSON文件中.
  • 引入repository键/值.
  • 介绍files changed,insertionsdeletions键/值.
  • 引入impact键/值,表示提交(insertions- deletions)的累积更改.
  • "通过'在允许或由用户输入创建的所有值上将它们转换为单引号来清理双引号,例如subject.
  • 几乎所有pretty=format:占位符都可用.
  • JSON通过注释掉/取消注释可用的键/值,轻松包含/排除将解析哪些键/值.
  • 易于阅读的代码经过全面评论.
  • 控制台上的脚本执行反馈.
  • 错误处理(因为需要正确设置存储库的路径).

成功,JSON被解析并保存. 成功,JSON被解析并保存.

错误001 错误001:存储库的路径不存在.

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


Pat*_*ara 5

git 不支持带有普通 --format 的统计信息,这很遗憾:( 但很容易编写脚本,这是我的快速而肮脏的解决方案,应该非常可读:

#!/bin/bash

format_log_entry ()
{
    read commit
    read date
    read summary
    local statnum=0
    local add=0
    local rem=0
    while true; do
        read statline
        if [ -z "$statline" ]; then break; fi
        ((statnum += 1))
        ((add += $(echo $statline | cut -d' ' -f1)))
        ((rem += $(echo $statline | cut -d' ' -f2)))
    done
    if [ -n "$commit" ]; then
        echo "$commit;$date;$summary;$statnum;$add;$rem"
    else
        exit 0
    fi
}

while true; do
    format_log_entry
done
Run Code Online (Sandbox Code Playgroud)

我敢肯定,它可以更好地编写脚本,但是嘿 - 它既快又脏;)

用法:

$ git log --pretty=format:"%h%n%ai%n%s" --numstat | ./script
Run Code Online (Sandbox Code Playgroud)

请注意,您指定的格式不是防弹的。分号可以出现在提交摘要中,这会破坏该行中的字段数 - 您可以将摘要移动到行尾或以某种方式将其转义 - 您想怎么做?


小智 5

git log  --oneline --pretty="@%h"  --stat   |grep -v \| |  tr "\n" " "  |  tr "@" "\n"
Run Code Online (Sandbox Code Playgroud)

这将显示如下内容:

git log  --oneline --pretty="@%h"  --stat   |grep -v \| |  tr "\n" " "  |  tr "@" "\n"
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,`--pretty`将覆盖`--oneline`,因此不需要同时指定两者。同样,`--stat`也将输出文件名,然后我们需要使用`grep -v \ |`将其删除,因此您可以使用`--shortstat`来避免解析另一个行项目([示例输出](https://i.stack.imgur.com/C7Wqq.png))。所以整个事情可以简化为`git log --pretty =“ @%h” –shortstat | tr“ \ n”“” | tr“ @”“ \ n”` (2认同)

avs*_*099 5

结合上面的所有答案,这是我的 2 美分,以防有人在看:

echo "commit id,author,date,comment,changed files,lines added,lines deleted" > res.csv 
git log --since='last year'  --date=local --all --pretty="%x40%h%x2C%an%x2C%ad%x2C%x22%s%x22%x2C" --shortstat | tr "\n" " " | tr "@" "\n" >> res.csv
sed -i 's/ files changed//g' res.csv
sed -i 's/ file changed//g' res.csv
sed -i 's/ insertions(+)//g' res.csv
sed -i 's/ insertion(+)//g' res.csv
sed -i 's/ deletions(-)//g' res.csv
sed -i 's/ deletion(-)//g' res.csv
Run Code Online (Sandbox Code Playgroud)

并将其保存到git-logs-into-csv.sh文件中,或者只是复制/粘贴到控制台中。

我认为这是相对不言自明的,但以防万一:

  • --all 从所有分支获取日志
  • --since 限制我们想要查看的提交数量
  • --shortstat - 了解提交中做了什么


fed*_*qui 4

这是一种方法awk

awk 'BEGIN{FS="[,;]"; OFS=";"} /;/ {a=$0} /^ /{gsub(/[a-z(+-) ]/,"") gsub(",",";"); print a,$0}'
Run Code Online (Sandbox Code Playgroud)

对于给定的输入,它返回:

ed6e0ab;2014-01-07 16:32:39 +0530;Foo;3;14;13
cdfbb10;2014-01-07 14:59:48 +0530;Bar;1;21
772b277;2014-01-06 17:09:42 +0530;Qux;7;72;7
Run Code Online (Sandbox Code Playgroud)

对于这样的线路仍然不起作用,5fde3e1;2014-01-06 17:26:40 +0530;Merge Baz没有3 files changed, 14 insertions(+), 13 deletions(-)后面的内容。