2013-04-11 78 views
3

我需要使用Git log命令来提取Commit Id,commit commit主体,其中commit-body包含特定的单词。我还需要仅打印包含该单词的提交主体中的那些行。使用Git Log命令的grep功能

使用下面的命令,我能够获得相关的提交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', 我得到了整个身体 - 提交我不需要。

关于如何获得所需信息的任何建议?

回答

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' 
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 
    } 
    } 
} 

然后

在cbuckley的回答
GitGrep AU_1..AU2 CRs-Fixed 
0

变化:

(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。

1

标记您的标题行作为饲养员:

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