使用Git Log命令的Grep功能

3
我需要使用Git log命令提取包含特定单词的提交消息中的提交ID和提交主题。同时,我还需要仅打印包含该单词的提交消息正文中的那些行。 使用以下命令,我可以获得相关的提交ID和主题,但无法查看包含“CRs-Fixed”单词的提交正文中的行。
git log --pretty=format:"%H,%s" AU_1..AU2 --no-merges --grep='CRs-Fixed'

如果我执行 git log --pretty=format:"%H,%s,%b" AU_1..AU2 --no-merges --grep='CRs-Fixed' 命令,会获取到整个提交记录,而我只需要其中的部分信息。请问有什么建议可以只获取所需信息吗?
4个回答

1

将您的标题行标记为保留项:

git log --pretty=format:$'\001%H\n\001%s\n%b' --grep='CRs-Fixed' \
| sed $'/^\001\\|Crs-Fixed/s/^\001//'


0

对cbuckley答案的变化:

(echo '$VAR1 = ['; \
git log --pretty='[ q(%H), q(%s), q(%b) ],' ; \
echo ']') \
| perl -e '$/=undef; $str = <>; $data = eval $str;
    foreach my $record (@$data) {
        next unless $record->[2] =~ /Scrivener/;
        print $record->[0], "\t", $record->[1], "\n" }'

在我的一个代码库中,这将产生以下结果。
e38e7dcd6e87ca08d4163aa7772a1559682b26ad    Ignore unnecessary Scrivener files.
794ececb7643653b0d3920aa6f548a2a9f94c5d6    Add "The Fallen". Changes to "Wirehead".

我认为这种技术的优雅性仍然有争议,但它确实允许您在所选语言中构建任意数据结构,并更轻松地使用它。例如,您可以轻松地从git-log构建JSON,尽管我在上面使用了perl的引用结构来避免引号问题。您也可以构建XML或HTML。


0

优雅的编程方式告诉我们,一定有更好的方法,但目前我所能想到的唯一解决方案就是利用标准的awkgrep

以下awk脚本会在所有额外的正文行前添加哈希符号:

if ($1 ~ /[0-9a-f]{40}/) { h=$1 } else { printf h } print

有了这个,我们就可以只获取我们想要的行:

git log --pretty='%H,%s,%b' AU_1..AU2 --no-merges --grep='CRs-Fixed' \
    | awk -F, --re-interval '{if($1~/[0-9a-f]{40}/){h=$1}else{printf h}print}' \
    | grep 'CRs-Fixed'

0

不是非常优雅,但你可以用 PowerShell 脚本来实现,像这样:

function GitGrep {
  param ([string]$range, [string]$grepThis)

  git log --pretty=format:"%H" $range --no-merges --grep="$grepThis" | ForEach-Object {
    $Body = git log -1 --pretty=format:"%b" $_ | Select-String "$grepThis"
    if($Body) {
      git log -1 --pretty=format:"%H,%s" $_
      Write-Host $Body
    }
  }
}

那么

GitGrep AU_1..AU2 CRs-Fixed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接