ここに私にとってうまくいく解決策があります。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, ®match, 0);
...
- hit = !regexec(regexp, mf2.ptr, 1, ®match, 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 grep
。git 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(®ex, needle, cflags);
regexp = ®ex;
// 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.