首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >git中的拖车选项--漂亮的选项

git中的拖车选项--漂亮的选项
EN

Stack Overflow用户
提问于 2020-12-20 07:52:06
回答 1查看 619关注 0票数 1

我试图从git日志中提取一个贡献摘要,并对其创建一个简明的摘要,并从中创建一个excel/csv来提交报告。

我确实试过

代码语言:javascript
代码运行次数:0
运行
复制
git log --after="2020-12-10" --pretty=format:'"%h","%an","%ae","%aD","%s","(trailers:key="Reviewed By")"'

CSV看起来就像在末尾有一个空白的CSV列。

代码语言:javascript
代码运行次数:0
运行
复制
...
"7c87963cc","XYZ","xyz@abc.com","Tue Dec 8 17:40:13 2020 +0000","[TTI] Add support for target hook in compiler.", ""
...

git log看起来就像

代码语言:javascript
代码运行次数:0
运行
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-20 13:09:12

我不确定,但:

  • 预告片键不能有空格(因此Reviewed By -> Reviewed-ByDifferential Revision -> Differential-Revision);
  • 不应用新行分隔拖车,而应将其与提交消息分隔开来(因此,您的问题中的Reviewed By不被视为预告片)。

我也不建议使用CSV,而是使用TSV : git输出不知道CSV语法(分号和逗号转义),因此输出文档可能是不可解析的。

如果提交消息看起来像这样(-而不是空格,没有新的行分隔符):

代码语言:javascript
代码运行次数:0
运行
复制
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

然后,下面的命令将适用于您:

代码语言:javascript
代码运行次数:0
运行
复制
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输出来处理sedawkperl或任何其他文本转换工具来生成报表。例如,处理类似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脚本方面相当薄弱,但让我试试。

代码语言:javascript
代码运行次数:0
运行
复制
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的人,也不知道下面的脚本有多地道,但它似乎很管用):

代码语言:javascript
代码运行次数:0
运行
复制
#!/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脚本是如何工作的:

  • 它假定不需要处理的记录从STX开始;
  • 它尝试为一个grep模式对每个非“STX”行进行grep,并将发现的结果保存到临时数组TRAILERS (它实际上充当一个多个数组,就像Key Name: Value中的Map<String, List<String>> );
  • 每个记录都按原样写入,但在检测新记录之前或在EOF上都会编写拖车。

编辑2(更好的awk)

嗯,我在awk方面真的很薄弱,所以一旦我读到了更多关于awk内部变量的内容,我就发现awk脚本可以完全重新实现,并且可以生成一个可以使用TSV的输出本身,而无需使用sedperl进行任何后处理。因此,脚本的更短和更好的版本是:

代码语言:javascript
代码运行次数:0
运行
复制
#!/bin/bash

git log --pretty=format:'%x1E%h%x1F%an%x1F%ae%x1F%aD%x1F%s%x1F%B%x1E' \
    | gawk -f trailers.awk
代码语言:javascript
代码运行次数:0
运行
复制
#!/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: ")
}

更简洁,更容易阅读,理解和维护。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65377951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档