以下命令在控制台上输出以下文本行
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日志文档,但找不到任何可以帮助我以这种格式呈现的格式。我提出的最好的是上面提到的命令。
因此,任何可以生成预期格式的命令或shell脚本都会有很大的帮助。
谢谢!
答案 0 :(得分:6)
遗憾的是,仅使用git log
无法实现。必须使用其他脚本来弥补大多数人不知道的事情: 某些提交没有统计信息 ,即使它们不合并。
我一直致力于一个将git log
转换为JSON
的项目,为了完成它,我必须做你需要做的事:用一行中的每个提交,统计数据。该项目名为 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
请注意,我已使用制表符(\t
)来分隔字段,因为;
可能已用于提交邮件。
此脚本的另一个重要部分是每行必须以唯一字符串开头(在这种情况下,它是提交)。那是因为我们的脚本需要知道线的开始位置。实际上,在git log
命令之后出现的任何内容都可以弥补某些提交可能没有统计信息的事实。
但令我感到震惊的是 你想要实现的目标 是以一种你可以可靠消费的格式整齐地输出提交。 Gitlogg 非常适合!它的一些功能是:
git log
解析为一个JSON
文件。repository
键/值。files changed
, insertions
和 deletions
键/值。impact
键/值,表示提交的累积更改(insertions
- deletions
)。"
)上将双引号'
转换为单引号subject
来清理双引号。pretty=format:
占位符都可用。JSON
。答案 1 :(得分:4)
git log --oneline --pretty="@%h" --stat |grep -v \| | tr "\n" " " | tr "@" "\n"
这将显示如下内容:
a596f1e 1 file changed, 6 insertions(+), 3 deletions(-)
4a9a4a1 1 file changed, 6 deletions(-)
b8325fd 1 file changed, 65 insertions(+), 4 deletions(-)
968ef81 1 file changed, 4 insertions(+), 5 deletions(-)
答案 2 :(得分:3)
git不支持使用plain --format的stat信息,这很遗憾:( 但它很容易编写它,这是我的快速和肮脏的解决方案,应该是非常可读:
#!/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
我敢肯定,它可以更好地编写脚本,但是嘿 - 这既快又脏;)
用法:
$ git log --pretty=format:"%h%n%ai%n%s" --numstat | ./script
请注意,您指定的格式不是防弹的。分号可以出现在提交摘要中,这会破坏此行中的字段数 - 您可以将摘要移动到行尾或以某种方式转义它 - 您想如何做?
答案 3 :(得分:2)
这是awk
的一种方法。
awk 'BEGIN{FS="[,;]"; OFS=";"} /;/ {a=$0} /^ /{gsub(/[a-z(+-) ]/,"") gsub(",",";"); print a,$0}'
对于给定的输入,它返回:
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
仍然不适用于5fde3e1;2014-01-06 17:26:40 +0530;Merge Baz
之后没有3 files changed, 14 insertions(+), 13 deletions(-)
的行。
答案 4 :(得分:0)
我在~/.bashrc
:
function git-lgs() {
git --no-pager log --numstat --format=%ai "$1" | sed ':a;N;$!ba;s/\n\n/\t/g' | sed 's/\(\t[0-9]*\t*[0-9]*\).*/\1/'
}
其中git-lgs
的参数是您要显示日志的文件名。
答案 5 :(得分:0)
跟进@ user2461539将其解析为列。适用于像“主题”这样的更复杂的cols。劈开选择你自己合适的分隔符。目前需要切割主题行,因为它会在溢出时截断其他列。
#!/bin/bash
# assumes "_Z_Z_Z_" and "_Y_Y_" "_X_X_" as unused characters
# Truncate subject line sanitized (%f) or not (%s) to 79 %<(79,trunc)%f
echo commit,author_name,time_sec,subject,files_changed,lines_inserted,lines_deleted>../tensorflow_log.csv;
git log --oneline --pretty="_Z_Z_Z_%h_Y_Y_\"%an\"_Y_Y_%at_Y_Y_\"%<(79,trunc)%f\"_Y_Y__X_X_" --stat \
| grep -v \| \
| sed -E 's/@//g' \
| sed -E 's/_Z_Z_Z_/@/g' \
| tr "\n" " " \
| tr "@" "\n" |sed -E 's/,//g' \
| sed -E 's/_Y_Y_/, /g' \
| sed -E 's/(changed [0-9].*\+\))/,\1,/' \
| sed -E 's/(changed [0-9]* deleti.*-\)) /,,\1/' \
| sed -E 's/insertion.*\+\)//g' \
| sed -E 's/deletion.*\-\)//g' \
| sed -E 's/,changed/,/' \
| sed -E 's/files? ,/,/g' \
| sed -E 's/_X_X_ $/,,/g' \
| sed -E 's/_X_X_//g'>>../tensorflow_log.csv
答案 6 :(得分:0)
结合以上所有答案,如果有人看,这是我的2美分:
['3','06','8','9','15','29 de diciembre de 2018']
并将其保存到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
文件中,或仅复制/粘贴到控制台中。
我认为这是相对不言自明的,但以防万一:
git-logs-into-csv.sh
从所有分支机构获取日志--all
限制了我们要查看的提交次数--since
-了解一些在提交中所做的事情