3

我需要使用 Git log 命令来提取 Commit Id,commit subject 其中 commit-body 包含一个特定的单词。我还需要只打印提交正文中包含该单词的那些行。

使用下面的命令,我可以获得相关的提交 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

4 回答 4

1

将您的标题行标记为守门员:

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

于 2013-05-10T20:27:57.990 回答
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。

于 2013-05-10T18:15:03.593 回答
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
于 2013-04-11T21:10:39.367 回答
0

优雅说必须有更好的方法,但目前我能看到的唯一解决方案是使用标准awkgrep.

以下 awk 脚本会导致将哈希添加到所有额外的正文行:

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

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

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'
于 2013-04-11T20:58:20.190 回答