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


152

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

回答:


227

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

git diff -- '*.c' '*.h'

1
OK、私のgitバージョンが古すぎました。1.7.8で宣伝されているとおりに動作します。優れた。
Mat

3
鉱山はブレース拡張、git diff -- *.{c,h,etc}
マットフレッチャー

9
二重ダッシュは重要です。git diff master HEAD -- "*filename.txt"また、便利ですgit diff master HEAD --name-only
neaumusic

一重引用符('')も重要です。git diff -- src/*.jsする必要がありますgit diff -- 'src/*.js'
ニコフタイム

1
gitリポジトリのルートディレクトリでもこれを行う必要があります。
ジョン・ジャン

10

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

git diff -- '***.py'

1
私にとっては、それが最善の解決策です。一部のファイル/ディレクトリを除外することもできます。例:git diff -- '***.py' ':!.Trashes'
Bartosz

(単一のアスタリスクと比較して)トリプルアスタリスクは何をしますか?
Jann Poppinga

IIRC 2つのアスタリスクは(場合によっては)ネストされたディレクトリ(空の場合も含む)を意味し、1つのアスタリスクと.pyはファイル名を意味します。したがって、現在のディレクトリまたはネストされたディレクトリにある* .pyファイルである必要があります。
Bohumir Zamecnik

8

(再帰的に検索した)シェルのglobstarを使用するか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つの隣接する*は、ディレクトリとサブディレクトリのみに一致します。」


4

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

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

空白は安全で、複数の拡張機能を持つこともできます。

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

3

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

git diff *.py

代わりに、あなたはにパイプfindすることができますgit diff

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

答えをもう少し読みやすくしてください。あなたはgit diff *.py叫びの見出しがあってもなくても十分だったでしょう
sehe

1
「叫びの見出し」は、シェルスクリプトの#コメントでした。
hughdbrown、2011

これは私にとって有効な唯一の解決策であり、引用符などはWindowsコマンドプロンプトでは機能しませんでした。
Ed Bayiates

1

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

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

例えば:

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

1
私が提供するとき、それは私のために働いた-拡張子の前に、このように、git diff master@{1} origin/master --name-only -- "*.cs"
333

0

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

とにかくこれは私のために働きました(私の例では、pythonファイル間の差分を探しています):

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

このstackoverflow.com/a/8554987/4233229は機能しますが、Windowsでは単一引用符ではなく二重引用符を使用する必要があります
lcnittl

0

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

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


0

私はこれで巻きました:

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.