35

git log特定のパターンに一致しないすべてのコミットを表示するために使用したいと考えています。以下を使用して、パターンに一致するすべてのコミットを表示できることを知っています。

git log --grep=<pattern>

一致の意味を反転するにはどうすればよいですか?

メッセージに「バージョンにぶつかった...」というコミットを無視しようとしています。

編集:最終出力をかなり冗長にしたい。例えばgit log --pretty --stat。したがって、からの出力git log --format=onelineは機能しません。

4

8 に答える 8

32

これはGit 2.4+ (2015 年第 2 四半期)で可能になります: Christoph Junghansによるコミット 22dfa8aを参照してください ( ) :junghans

log: ティーチ--invert-grepオプション

" " は、指定された文字列に一致するメッセージを持つコミットのみを表示しますが、特定のメッセージを持たないgit log --grep=<string>コミットのみを表示できると便利な場合があります (たとえば、「FIXUP コミットではないものを表示してください」)。

もともとinvert-grepフラグはgrep_optにありましたが、 " "は既に " " で覆われている" "git grep --invert-grepと組み合わせないと意味がないため、リビジョン構造に移動しました。 そこにフラグがあることで、より機能を特徴に表現できます。--files-with-matches--files-without-matches

新しく挿入された 2 つのテストが実行されると、履歴にはメッセージ " initial"、" second"、" third"、" fourth"、" "、" fifth"、" sixth"Secondがこの順序でコミットされます。" " にも " "
にも一致しないコミットは " " と " " です。大文字と小文字を区別しない場合は、" " のみが一致します。thSecsecondinitialinitial

--invert-grep

で指定されたパターンに一致しないログ メッセージを含むコミット出力を制限します--grep=<pattern>

例:

最初に、「シーケンサー」を含むメッセージを grep します。

vonc@voncm C:\Users\vonc\prog\git\git

> git log -2 --pretty="tformat:%s" --grep=sequencer
Merge branch 'js/sequencer-wo-die'
sequencer: ensure to release the lock when we could not read the index

シーケンサーのないメッセージが必要な場合:

> git log -2 --pretty="tformat:%s" --grep=sequencer --invert-grep
Second batch for 2.11
Merge branch 'js/git-gui-commit-gpgsign'

警告: これは で指定されたパターンのみを反転し--grepます。Git 2.35 以降 (2022 年第 1 四半期) から、、 などのヘッダーの一致が反転しなくなり
ます。「次の等価性 」の例を参照してください。--author--committer
git log --exclude-author?

于 2015-02-15T04:47:46.780 に答える
16

すべてのコミットのリストを生成し、ログ メッセージに問題のあるパターンが含まれているものを除外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
于 2011-04-09T17:02:42.573 に答える
8

柔軟性の高い比較的単純な方法は、awk にパイプされた -z オプションを指定して git log を使用することです。-z オプションは、コミット レコード間に null を追加するため、awk で簡単に解析できます。

git log --color=always -z | awk -v RS=\\0

(出力がパイプの場合、カラーリングを維持するには color=always が必要です)。次に、各フィールドで機能するブール式を簡単に追加できます。たとえば、これは作成者の電子メールが fugly.com からのものではなく、コミット日が日曜日であるすべてのエントリを出力します。

git log --color=always -z | awk -v RS=\\0 '!/Author:.*fugly.com>/ && /Date:.* Sun /'

もう 1 つの優れた点は、任意の書式設定オプションまたはリビジョン範囲を git ログに追加でき、引き続き機能することです。

最後に、ページ分割したい場合は、「less -r」を使用して色を保持してください。

編集: awk で -v を使用するように変更して、少し簡単にしました。

于 2012-10-19T18:44:20.057 に答える
1

thebriguyの回答と同様に、grepには -z オプションもあり、行ではなくnullで終了する文字列を処理できます。これは、一致を反転するのと同じくらい簡単です。

git log -z --color | grep -vz "bumped to version"

安全のために、コミット メッセージ内でのみ照合することをお勧めします。これを grep で行うには、パール式を使用して、null で終了する文字列内の改行を一致させる必要があります。ヘッダーをスキップするには:

git log -z | grep -Pvz '^commit.*\nAuthor:.*\nDate:.*\n[\S\s]*bumped to version'

または色付き:

git log -z --color | \
  grep -Pvz '^.....commit.*\nAuthor:.*\nDate:.*\n[\S\s]*bumped to version'

最後に、 --stat を使用する場合、コミット文字列を含むファイル名の一致を避けるために、この出力の先頭を一致させることもできます。したがって、質問に対する完全な回答は次のようになります。

log -z --color --pretty --stat | \
  grep -Pvz '^.....commit.*\nAuthor:.*\nDate:.*\n[\S\s]*?bumped to version[\S\s]*?\n [^ ]'

grep -P私のマニュアルページでは「非常に実験的」と説明されていることに注意してください。pcregreplibpcre を使用する代わりに使用する方がよい場合があります。grep で新しい行にパターンを与えるには? を参照してください。. grep -P私にとっては問題なく動作しますが、 -z オプションまたは同等のものがあるかどうかはpcregrepわかりません。

于 2013-09-21T11:10:09.140 に答える
1

結果を含むすべてのコミットのリストを取得し、それらのハッシュを除外します。

git log --format=oneline | grep -v `git log --grep="bumped to version" --format="%h"`
于 2011-04-09T01:26:44.397 に答える
0

私が知る限り、これは 1 つのコマンド ラインで直接実行することはできません。Justin Lillyが提案するようなことをしてから、結果のハッシュのリストで「git log」を実行する必要があります。

git log --format="%h" | grep -v `git log -1 --grep="bumped to version" --format="%h"` > good-hashes
for h in `cat good-hashes`; do
    PAGER=cat git log -1 --pretty --stat $h
done

トリックを行う必要があります。

于 2011-04-09T02:45:24.940 に答える
-1
git log --pretty --stat | grep -v "bumped to version"
于 2011-04-09T01:39:16.603 に答える