git diffからディレクトリを除外する


179

ディレクトリ全体をGitの差分から除外するにはどうすればよいですか。(この場合は/ spec)。git diffコマンドを使用して、ソフトウェアリリース全体の差分を作成しています。ただし、仕様への変更はこの手順には関係なく、頭痛の種になるだけです。今私はできることを知っています

git diff previous_release..current_release app/

これにより、たとえばlib /ディレクトリではなく、appディレクトリのすべての変更の差分が作成されます。誰かがこのタスクを達成する方法を知っていますか?ありがとう!

編集:明確にしたいだけですが、/ specを除いて、最後にすべてのディレクトリのパラメーターを文字列化できます。コマンドで単一のディレクトリを本当に除外する方法があることを望んでいました。


4
サブモジュールを無視することを目指していたので、この驚くべき質問を見つけました。この場合、あなたが私ほどナイーブであれば、この質問はより役に立ちます。
brandizzi

2016
Michael Z

回答:


138

bashを使用し、拡張グロビング(shopt -s extglob)を有効にしたとすると、シェル側から処理できます。

git diff previous_release current_release !(spec)

他のすべてのものをリストする必要がなくなります。

または、シェルに依存しない:

git diff previous_release current_release --name-only | grep -v '^spec/' \
    | xargs git diff previous_release current_release --

これを1行のシェルスクリプトにまとめることで、引数を再入力する手間を省くことができます。


1
PSあなたが強迫ならそう、あなたが上タックすることがあります、隠しファイルと一致しないグロブ.!(.|)から始まる試合すべてに.ほか...
Cascabel

これは、まったく新しいファイルやブランチ間で削除されたファイルでは機能しないようです。スクリプトの実行を停止するエラーが発生し、スクリプトとの比較ができないというメッセージが表示されます。
Graham Christensen

2
@Graham:私は--追加したばかりがそれを修正するべきだと思います。
Cascabel

1
素晴らしい答え。(実際の差分ではなく)名前だけを表示したいので--name-only、最後にも追加する必要がありました。
2014年

1
それで遊んでた後、ちょうどあなたがファイルの名前を変更した場合、それはエラーがスローされますが、すべてを行う必要が追加であることを追加したい-- path/of/new/fileと、それは:)それを把握します
8月

321

この回答に基づいて次のものも使用できます。

git diff previous_release..current_release -- . ':!spec'

これは、特定のパスを除外できる新しいgit機能です。さまざまなシェルワンライナーよりも信頼性が高いはずです。

この質問はまだ「git diff exclude path」の#1ヒットなので、ここに投稿します。


4
この答えが大好きです。オプションを追加する場合は、二重ダッシュの前に追加してください。例: git diff previous_release current_release --name-status -- . ':!spec'
liamvictor

私はブランチ名を使用することができます実現しなかったcurrent_releaseprevious_release私はそれを考え出したとき、私は笑顔作られ- 。
trueheart78

2
何が私のために働いたgit diff --stat dev -- . ':!/Mopy/Docs/*'。何やっていない私にとって仕事git diff dev --stat -- . ':!('Mopy/Docs/Wrye Bash General Readme.html'|'Mopy/Docs/Wrye Bash Advanced Readme.html')'とバリエーション
Mr_and_Mrs_D

本当に役に立ちました。ここでdatabase.ymlの以外のすべてのファイルが変更されたかどうかを確認するための構文は、次のとおりです。git diff --check -- . ':!config/database.yml'
ダンコーン

17
次のように複数のアイテムを除外することもできます:git diff previous_release current_release -- . ':!file_a' ':!file_b'
PseudoNoise

37

git diffで除外する複数のパスを指定する場合は、末尾に追加の除外パラメーターを追加するだけです。たとえば、statsからvendorおよびbinディレクトリのすべてを除外します。

git diff --stat previous_release..current_release -- . ':!vendor' ':!bin'

33

libディレクトリ内のすべてのファイルのdiff属性を設定解除してみてください。
.gitattributes

lib/* -diff

racl101コメントに追加します

これを追加するだけで、制限したい人のために git diffに、特定のタイプのファイルの出力を特定のディレクトリとそのサブディレクトリ内.jsために、たとえば、Webpackのファイルのバンドルによって生成されるすべてのJavaScriptのように、これを追加できますへ.gitattributes

dist/js/**/*.js -diff

次に、git diff出力にそのすべてのノイズが表示されず、次のように表示されBinary files ... differます。


これは私の差分のすべてからスペックを削除します。この「リリース」差分を実行しているときではなく、まだspecフォルダーに自分の差分を表示したい
Mysrt

2
@Mystr:.gitattributesこの種類の「リリース」差分専用に作成された特別なブランチにそのファイルを設定できます;)その特別なブランチをリベースしcurrent_release、そこから差分を実行します。
VonC

これも、ブランチ間で削除されたファイルに対しては機能しないようです。削除されたファイルはまだ完全な差分を示しています。
グラハムクリステンセン、

うまくいきません。_パスは特別ですか?_site/* -diff
マリウス

@MariusAndreianaいいえ、「_」は特別ではありません。git-scm.com/docs/git-check-attr
VonC

22

Git diffがカスタム除外フォーマットを受け入れるようになりました: git diff -- ':(exclude)lib/*'

現在の作業ディレクトリとgitルートディレクトリに関連するファイルが除外されるため、反復するフォルダ名(「/ app」、「/ lib」など)が多い場合は注意してください。


1
ドットが欠けていますgit diff -- . ':(exclude)lib/*'か?
Nicolas Dermine 2017

1
@NicolasDermineいいえ、あなたが書いたものは同等ですが。パスの「含む」部分もオプションです。そのgit diffため、必要ではなく、現在のパスに関連するすべてに対して行うことができますgit diff -- .
MaxPRafferty

注:Windowsマシンでは、次のように二重引用符を使用してくださいgit diff -- ":(exclude)lib/*"
cnlevy

理由はわかりませんが、@ NicolasDermineで提案されているように、私にとってはドットでのみ機能します。私はwin10でCmderを使用しています。
Olivvv

3

gitルートディレクトリを基準

git diff オプションの除外を受け入れます

git diff -- ":(exclude)thingToExclude"

いくつかのワイルドカードを追加することができます

git diff -- ":(exclude)*/thingToExclude/*"

特定のファイルタイプをターゲットにする

git diff -- ":(exclude)*/$1/*.png"

適用された構文糖

git diff -- ":!/\$1/"

または、ドットファイル用の小さなスクリプトをドロップします

など、.bash_profileまたは.zshrc

gde() {
    : '
        git diff exclude files or folders
        usage:
        gde fileOrFolderNameToExclude
    '
    git diff -- ":!/\$1/"
}

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