すべてのコミットのリストを生成し、ログ メッセージに問題のあるパターンが含まれているものを除外git log
し、必要なオプションを使用して結果をフィードします。最終段階では、git log
便利なオプションがいくつかあります。
--stdin
コマンドラインにリストされたコミット
に加えて、標準入力からそれらを読み取ります。
--no-walk
指定された rev のみを表示しますが、祖先をたどりません。
単一のパイプラインとプロセスの置換でそれを行うことができます。
#! /bin/bash
if (( $# < 1 )); then
echo >&2 "Usage: $0 pattern [<since>..<until>]"
exit 1
fi
pattern=$1
shift
git log --format=%H $@ |
grep -v -f <(git log --format=%H "--grep=$pattern" $@) |
git log --pretty --stat --stdin --no-walk
bash を使いたくない場合は、Perl を使用できます。
#! /usr/bin/env perl
use strict;
use warnings;
no warnings "exec";
sub usage { "Usage: $0 pattern\n" }
sub commits_to_omit {
my($pattern) = @_;
open my $fh, "-|", "git", "log", "--grep=$pattern", "--format=%H", @ARGV
or die "$0: exec: $!";
my %omit = map +($_ => 1), <$fh>;
%omit;
}
die usage unless @ARGV >= 1;
my $pattern = shift;
my %omit = commits_to_omit $pattern;
open my $all, "-|", "git", "log", "--format=%H", @ARGV
or die "$0: exec: $!";
open my $out, "|-", "git", "log", "--pretty", "--stat", "--stdin", "--no-walk"
or die "$0: exec: $!";
while (<$all>) {
print $out $_ unless $omit{$_};
}
上記のいずれかがPATHにgit-log-vgrep
あり、フォームの履歴があると仮定します
$ git ローラ
* b0f2a28 (tmp、機能 1) D
* 68f87b0 C
* d311c65B
* a092126A
| | * 83052e6 (HEAD、オリジン/マスター、マスター) Z
| | * 90c3d28Y
| | * 4165a42 X
| | * 37844cb W
|/
* f8ba9ea V
私たちは言うことができます
$ git log-vgrep X
Z、Y、W、および V を取得します。
他のブランチも記録できるので、
$ git log-vgrep tmp
D、C、B、および V を与えます。と
$ git log-vgrep C tmp~2..tmp
D だけが得られます。
上記の実装の制限の 1 つは、すべてのコミットに一致するパターン( 、または など)を使用すると、HEAD が返されることです。これがどのように機能するかです:.
^
git log
$ git log --stdin --no-walk --pretty=oneline </dev/null
83052e62f0dc1c6ddfc1aff3463504a4bf23e3c4 Z