我试图从git日志中提取一个贡献摘要,并对其创建一个简明的摘要,并从中创建一个excel/csv来提交报告。
我确实试过
git log --after="2020-12-10" --pretty=format:'"%h","%an","%ae","%aD","%s","(trailers:key="Reviewed By")"'
CSV看起来就像在末尾有一个空白的CSV列。
...
"7c87963cc","XYZ","xyz@abc.com","Tue Dec 8 17:40:13 2020 +0000","[TTI] Add support for target hook in compiler.", ""
...
git log
看起来就像
commit 7c87963cc
Author: XYZ <xyz@abc.com>
Date: Tue Dec 8 17:40:13 2020 +0000
[TTI] Add support for target hook in compiler.
This adds some code in the TabeleGen ...
This is my body of commit.
Reviewed By: Sushant
Differential Revision: https://codereviews.com/DD8822
我不能成功的是使用Differential Revision
命令提取(trailers:key="Reviewed By")
字符串。
我找不到多少关于如何让这件事奏效的东西。我查看了git手册,并尝试了它的解释。
这条命令里有什么东西我可能遗漏了吗?预期的输出应该在上述CVS输出的最后位置具有文本https://codereviews.com/DD8822
。
发布于 2020-12-20 05:09:12
我不确定,但:
Reviewed By
-> Reviewed-By
和Differential Revision
-> Differential-Revision
);Reviewed By
不被视为预告片)。我也不建议使用CSV,而是使用TSV : git输出不知道CSV语法(分号和逗号转义),因此输出文档可能是不可解析的。
如果提交消息看起来像这样(-
而不是空格,没有新的行分隔符):
commit 7c87963cc
Author: XYZ <xyz@abc.com>
Date: Tue Dec 8 17:40:13 2020 +0000
[TTI] Add support for target hook in compiler.
This adds some code in the TabeleGen ...
This is my body of commit.
Reviewed-By: Sushant
Differential-Revision: https://codereviews.com/DD8822
然后,下面的命令将适用于您:
git log --pretty=format:'%h%x09%an%x09%ae%x09%aD%x09%s%x09%(trailers:key=Reviewed-By,separator=%x20,valueonly)%x09%(trailers:key=Differential-Revision,separator=%x20,valueonly)'
生成短提交id、作者姓名、作者电子邮件、日期、提交消息、预告片Reviewed-By
和预告片Differential-Revision
到您的选项卡分隔的值输出。
如果您可能不会更改旧的提交消息,因为您的历史记录不安全(它是由对等方发布、提取的,您的工具绑定到已发布的提交散列),那么您必须使用git log
输出来处理sed
、awk
、perl
或任何其他文本转换工具来生成报表。例如,处理类似git log --pretty=format:'%x02%h%x1F%an%x1F%ae%x1F%aD%x1F%s%x1F%n%B'
的内容,其中应该以某种方式分析^B
(STX)和EOF之间的行(对您感兴趣的拖车进行筛选),然后从^B
开始连接到它们的组行,然后替换字符,分别用\t
替换字段分隔符和no字符。
但是,如果您可以通过修复提交消息预告片来编辑历史记录(不确定它可能会产生多大影响),我建议您这样做,然后拒绝额外的脚本处理预告片的想法,这些预告片是git-interpret-trailers
无法识别的,只需修复提交消息。
编辑1(文本工具)
如果重写历史记录不是一个选项,那么实现一些脚本可能会帮助您解决问题。我在编写强大的sed
/awk
/perl
脚本方面相当薄弱,但让我试试。
git log --pretty=format:'%x02%h%x1F%an%x1F%ae%x1F%aD%x1F%s%x1F%n%B' \
| gawk -f trailers.awk \
| sed '$!N;s/\n/\x1F/' \
| sed 's/[\x02\x1E]//g' \
| sed 's/\x1F/\x09/g'
它的工作原理:
git
生成一个用标准C0 C1码分隔的数据日志,假设没有这样的字符--您的提交消息(STX、RS和US )--我不知道这样使用它们是否是一个好地方,以及我是否应用它们在语义上是正确的);gawk
过滤试图解析STX启动组的日志输出并提取拖车,生成“双行”输出(常规数据的每条奇数行,逗号连接的拖车值的偶数行,甚至是缺失的拖车);sed
通过对将奇数行和偶数行连接起来(学分归卡洛利·霍瓦斯);sed
去除STX和RS;sed
将我们替换为TAB。这里是trailers.awk
(同样,我不是awk
的人,也不知道下面的脚本有多地道,但它似乎很管用):
#!/usr/bin/awk -f
BEGIN {
FIRST = 1
delete TRAILERS
}
function print_joined_array(array) {
if ( !length(array) ) {
return
}
for ( i in array ) {
if ( i > 0 ) {
printf(",")
}
printf("%s", array[i])
}
printf("\x1F")
}
function print_trailers() {
if ( FIRST ) {
FIRST = 0
return
}
print_joined_array(TRAILERS["Reviewed By"])
print_joined_array(TRAILERS["Differential Revision"])
print ""
}
/^\x02/ {
print_trailers()
print $0
delete TRAILERS
}
match($0, /^([-_ A-Za-z0-9]+):\s+(.*)\s*/, M) {
TRAILERS[M[1]][length(TRAILERS[M[1]])] = M[2]
}
END {
print_trailers()
}
awk
脚本是如何工作的:
grep
模式对每个非“STX”行进行grep
,并将发现的结果保存到临时数组TRAILERS
(它实际上充当一个多个数组,就像Key Name: Value
中的Map<String, List<String>>
);编辑2(更好的awk
)
嗯,我在awk
方面真的很薄弱,所以一旦我读到了更多关于awk
内部变量的内容,我就发现awk
脚本可以完全重新实现,并且可以生成一个可以使用TSV的输出本身,而无需使用sed
或perl
进行任何后处理。因此,脚本的更短和更好的版本是:
#!/bin/bash
git log --pretty=format:'%x1E%h%x1F%an%x1F%ae%x1F%aD%x1F%s%x1F%B%x1E' \
| gawk -f trailers.awk
#!/usr/bin/awk -f
BEGIN {
RS = "\x1E"
FS = "\x1F"
OFS = "\x09"
}
function extract(array, trailer_key, __buffer) {
for ( i in array ) {
if ( index(array[i], trailer_key) > 0 ) {
if ( length(__buffer) > 0 ) {
__buffer = __buffer ","
}
__buffer = __buffer substr(array[i], length(trailer_key))
}
}
return __buffer
}
NF > 1 {
split($6, array, "\n")
print $1, $2, $3, $4, $5, extract(array, "Reviewed By: "), extract(array, "Differential Revision: ")
}
更简洁,更容易阅读,理解和维护。
https://stackoverflow.com/questions/65377951
复制