web-dev-qa-db-ja.com

ファイル拡張子に基づいてgit diffをフィルタリングする方法は?

git diffを特定のファイル拡張子セットに制限するオプションはありますか?

122
vfclists

はい、Gitがシェルではなくグロブを展開することを確認すると、任意のレベルで一致するため、このようなもの(引用符が重要)が正常に機能するはずです。

git diff -- '*.c' '*.h'
184
CB Bailey

シェルのグロブスターを使用する(再帰検索を行う)1、2

shopt -s globstar 
git diff -- *.py **/*.py

またはfindを使用します。

find -name '*.py' -print0 | xargs -0 git diff --

これらは両方とも特別な名前と空白の証拠です。拡張子が.pyのディレクトリをフィルタリングすることもできますが:)


1 したい git diff -- {.,**}/*.py通常

2 globstarが有効な場合、git diff -- **/*.pyはすでに./*.py。 Bashのマンページ:「/が後に続く場合、2つの隣接する*はディレクトリとサブディレクトリのみに一致します。」

8
sehe

(現在のディレクトリを含む)ファイルを再帰的に含めるには、これがうまくいきました:

git diff -- '***.py'
6

拡張用のコマンドライン引数。

git diff *.py

別の方法として、findgit diffにパイプすることができます:

find . -name '*.py' -type f | git diff --
1
hughdbrown

単純なファイルパターンの場合、これは機能するようです。

$ git ls-files -zm '*.txt' | xargs --null git diff

空白は安全であり、複数の拡張機能を使用することもできます。

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff
1
Mat

私はこれで終わった:

commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --

これは、ファイル名にWord 'test'(大文字と小文字を区別しない)が含まれ、.sqlで終わらない場合にのみ、指定したコミットの差分を表示します。必要に応じてパイプラインを変更します。

上記の回答はいずれも、git bash Windowsの場合。それがバージョンのもの(1.8.4を使用しています)なのか、Windows/bashのものなのかわかりません。また、私の場合、各ブランチに他のブランチには存在しない追加ファイルがある2つのブランチを比較したかったのです(したがって、「検索」ベースのファイルはありません)。

とにかくこれは私のために働いた(私の例では、python files)間の差分を探している:

git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`
0
Yonatan

git diffは、ステージングされていないファイルの違いのみを表示します。

.infoファイルをgit diffから除外したかったため、この質問を見つけました。 git add *.infoでステージングすることでこれを達成し、残っているファイルを減らしました。

0
Alan Whitelaw

Gitバージョン2.18.0でテストしたように、二重引用符の間にファイル拡張子を記述する必要があります。ローカルリポジトリとリモートリポジトリの最後の違いを見つけたい場合は、プルした後、次のように書くことができます:

git diff YourBranchName@{1} YourBranchName --name-only "*.YourFileExtionsion"

例えば:

git diff master@{1} Origin/master --name-only "*.cs"

0
marjan.javid