2013-04-11 276 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//'