3

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

4 に答える 4

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

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

私のリポジトリの1つでは、これにより次の結果が得られます。

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

Elegance は、もっと良い方法があるに違いないと言っていますが、今のところ、私が見ることができる唯一の解決策は、標準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 に答える