使用Git Log命令执行Grep功能

时间:2013-04-11 20:32:03

标签: git gerrit

我需要使用Git log命令来提取提交ID,提交主题,其中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 个答案:

答案 0 :(得分:1)

将标题行标记为管理员:

  

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

答案 1 :(得分:0)

Elegance说必须有更好的方法,但现在我能看到的唯一解决方案是使用标准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'

答案 2 :(得分: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

答案 3 :(得分: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。