Grep功能与Git日志命令



我需要使用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',我得到了我不需要的整个提交体。

关于如何只获得所需的信息有什么建议吗?

将标题行标记为keepers:

git log --pretty=format:$'01%Hn01%sn%b' --grep='CRs-Fixed'
| sed $'/^01\|Crs-Fixed/s/^01//'

不是很优雅,但是您可以在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

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

chbuckley回答的变化:

(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

最新更新