36

特定のコミットで変更されたファイルのリストを作成しようとしています。問題は、すべてのファイルの先頭のコメントにバージョン番号があることです。このコミットにより新しいバージョンが導入されるため、すべてのファイルが変更されたことを意味します。

変更されたコメントは気にしないので、 にgit diff一致するすべての行を無視したいと思い^\s*\*.*$ます。これらはすべてコメント (/* */ の一部) であるためです。

git diff特定の行を無視するように指示する方法が見つかりません。

私はすでに textconv 属性を設定して、ファイルを比較する前に Git がファイルを sed に渡すようにしようとしました。これにより、sed は問題のある行を取り除くことができgit diff --name-statusます。もちろん、すべてのハッシュが変更されています。

これを行う方法はありますか?

4

8 に答える 8

21

ここに私にとってうまくいく解決策があります。git (log|diff) -G<regex>解決策と、オプションに関するいくつかの不足しているドキュメントを書き上げました。

*基本的には以前の回答と同じソリューションを使用していますが、特に aまたは aで始まるコメント#、および場合によっては前のスペース... ただし、、 などの変更*を許可する必要があります。#ifdef#include

先読みと後読みは-Gオプションでサポートされていないようで、 も?一般的にサポートされていません。私も の使用*に問題がありました。 +しかし、うまく機能しているようです。

(注、Git v2.7.0 でテスト済み)

複数行コメントバージョン

git diff -w -G'(^[^\*# /])|(^#\w)|(^\s+[^\*#/])'
  • -w空白を無視する
  • -G次の正規表現に一致する差分行のみを表示します
  • (^[^\*# /])スター、ハッシュ、またはスペースで始まらない行
  • (^#\w)で始まり#、文字が続く任意の行
  • (^\s+[^\*#/])空白で始まり、その後にコメント文字が続く任意の行

基本的に、SVN フックはすべてのファイルを変更し、すべてのファイルの複数行のコメント ブロックを変更します。これで、SVN がコメントにドロップする FYI 情報がなくても、変更を SVN と比較できるようになりました。

技術的には、これにより Python と Bash のコメント#TODOが diff に表示されるようになり、除算演算子が C++ の新しい行で開始された場合、無視される可能性があります。

a = b
    / c;

-Gまた、 Gitのドキュメントはかなり不足しているように見えたので、ここの情報が役立つはずです。

git diff -G<regex>

-G<regex>

一致する追加/削除された行がパッチ テキストに含まれている相違点を探します<regex>

-S<regex> --pickaxe-regexとの違いを説明するため-G<regex>に、同じファイルに次の差分があるコミットを考えてみましょう。

+    return !regexec(regexp, two->ptr, 1, &regmatch, 0);
...
-    hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);

このgit log -G"regexec\(regexp"コミットは表示されますが、表示 git log -S"regexec\(regexp" --pickaxe-regexされません (その文字列の出現回数が変更されていないため)。

詳細については、gitdiffcore (7)のつるはしのエントリを参照してください。

(注、Git v2.7.0 でテスト済み)

  • -G基本的な正規表現を使用します。
  • 、、、、、正規表現構文はサポートされていませ?ん。*!{}
  • でのグループ化とグループ()の OR-ing は で機能し|ます。
  • \s、などのワイルドカード文字\Wがサポートされています。
  • 先読みと後読みはサポートされていません。
  • 開始行アンカーと終了行アンカー^$が機能します。
  • この機能は Git 1.7.4 以降で利用可能です。

除外されたファイル v 除外された差分

この-Gオプションは、差分されるファイルをフィルタリングすることに注意してください。

ただし、ファイルが「差分」になると、以前に「除外/含まれた」行はすべて差分に表示されます。

に言及している行が少なくとも 1 行あるファイルの違いのみを表示しますfoo

git diff -G'foo'

で始まる行を除くすべてのファイルの違いを表示します#

git diff -G'^[^#]'

FIXMEまたは言及している相違点があるファイルを表示するTODO

git diff -G`(FIXME)|(TODO)`

git log -G、、、、およびも参照してくださいgit grepgit log -S--pickaxe-regex--pickaxe-all

更新: -G オプションで使用されている正規表現ツールはどれですか?

https://github.com/git/git/search?utf8=%E2%9C%93&q=regcomp&type=

https://github.com/git/git/blob/master/diffcore-pickaxe.c

if (opts & (DIFF_PICKAXE_REGEX | DIFF_PICKAXE_KIND_G)) {
    int cflags = REG_EXTENDED | REG_NEWLINE;
    if (DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE))
        cflags |= REG_ICASE;
    regcomp_or_die(&regex, needle, cflags);
    regexp = &regex;

// and in the regcom_or_die function
regcomp(regex, needle, cflags);

http://man7.org/linux/man-pages/man3/regexec.3.html

   REG_EXTENDED
          Use POSIX Extended Regular Expression syntax when interpreting
          regex.  If not set, POSIX Basic Regular Expression syntax is
          used.

// ...

   REG_NEWLINE
          Match-any-character operators don't match a newline.

          A nonmatching list ([^...])  not containing a newline does not
          match a newline.

          Match-beginning-of-line operator (^) matches the empty string
          immediately after a newline, regardless of whether eflags, the
          execution flags of regexec(), contains REG_NOTBOL.

          Match-end-of-line operator ($) matches the empty string
          immediately before a newline, regardless of whether eflags
          contains REG_NOTEOL.
于 2016-02-09T20:11:07.063 に答える
15
git diff -G <regex>

バージョン番号の行と一致しない正規表現を指定します。

于 2014-02-10T10:19:35.230 に答える
10

git difftool外部差分ツールを起動するのが最も簡単であることがわかりました。

git difftool -y -x "diff -I '<regex>'"
于 2015-06-23T13:30:50.430 に答える
4

解決策を見つけました。このコマンドを使用できます:

git diff --numstat --minimal <commit> <commit> | sed '/^[1-]\s\+[1-]\s\+.*/d'

コミット間で複数の行が変更されたファイルを表示するには、コメント内のバージョン番号だけが変更されたファイルを除外します。

于 2013-05-13T17:05:53.457 に答える
2

「git diff」出力で「grep」を使用すると、

git diff -w | grep -c -E "(^[+-]\s*(\/)?\*)|(^[+-]\s*\/\/)"

コメント行の変更のみを計算できます。(ア)

「git diff --stat」出力を使用して、

git diff -w --stat

すべてのライン変更を計算できます。(ロ)

コメント以外のソース行の変更 (NCSL) カウントを取得するには、(B) から (A) を引きます。

説明:

「git diff」出力 (空白の変更は無視されます) では、

  • 変更された行を意味する「+」または「-」で始まる行に注意してください。
  • この後にオプションの空白文字を含めることができます。'\s*'
  • 次に、コメント行パターン '/*' (または) '*' (または) '//' のみを探します。
  • 「-c」オプションはgrepで指定されるため、カウントを出力するだけです。差分でコメントのみを表示するには、「-c」オプションを削除します。

注:以下の仮定により、コメントの行数に小さな誤差が生じる可能性があります。

  • 1.) ソースファイルは C 言語に基づいています。Makefile とシェル スクリプト ファイルには、コメント行を示すための "#" という異なる規則があり、それらが diffset の一部である場合、それらのコメント行はカウントされません。

  • 2.) 行変更の Git 規則: 行が変更された場合、Git はその特定の行が削除され、そこに新しい行が挿入されたと見なし、実際には 1 行が変更されているのに 2 行が変更されているように見える場合があります。

     In the below example, the new definition of 'FOO' looks like a two-line change.
    
     $  git diff --stat -w abc.h
     ...
     -#define FOO 7
     +#define FOO 105
     ...
     1 files changed, 1 insertions(+), 1 deletions(-)
     $
    
  • 3.) パターンに一致しない有効なコメント行 (または) パターンに一致する有効なソース コード行は、計算でエラーを引き起こす可能性があります。

以下の例では、「*」で始まらない「+ blah blah」行はコメント行として検出されません。

           + /*
           +  blah blah
           + *
           + */

以下の例では、「+ *ptr」行は有効なソースコード行ですが、* で始まるため、コメント行としてカウントされます。

            + printf("\n %p",
            +         *ptr);
于 2016-08-22T11:03:25.977 に答える