「git diff」からファイルを除外したい


229

db/irrelevant.phpGit差分からファイル()を除外しようとしています。私は、内のファイルを入れて試してみましたdbというサブディレクトリ.gitattributesのラインとirrelevant.php -diff し、また、私はと呼ばれるファイル作成しようとした.git/info/attributes含有しましたdb/irrelevant.php

すべての場合において、db/irrelevant.phpファイルはGitバイナリパッチとしてdiffに含まれています。そのファイルへの変更がdiffコマンドによって無視されるようにしたいのです。何が悪いのですか?

回答:


325

ひどいファイルを除外するためのOMG、ドライバー、awk?git 1.9以降では、次のことができます。

git diff -- . ':(exclude)db/irrelevant.php' ':(exclude)db/irrelevant2.php'

ああ、エレガンス!引用された答えを見て、詳細については@torekによるこの答え


4
注:特定のファイル名を除外する場合は、.gitignoreファイル構文とは異なり、アスタリスクを前に付ける必要があります。例えばの:!*shrinkwrap.yaml代わりに:!shrinkwrap.yaml
ヴォーン

7
より多くのファイルを除外します。たとえば、git diffから回避するために* .min.cssおよび* .min.jsファイルがあります。したがって、私はコマンドを使用しますgit diff -- . ':(exclude)*.min.js' ':(exclude)*.min.css'
maheshwaghmare

4
Windows構文:(一git diff -- . ":(exclude)db/irrelevant.php"重引用符ではなく二重引用符)
cnlevy

4
ありがとうございました!そのような難解な構文..私は毎回それを調べなければなりません。
ダニエルウォルトリップ

1
@cnlevyまたは引用符なし!git diff -- . :(exclude)db/irrelevant.php
Matthias

62

no opコマンドを使用してカスタムdiffドライバーをセットアップし、無視する必要があるファイルに割り当てることができます。

このコマンドでリポジトリ固有の差分ドライバー作成する

git config diff.nodiff.command /bin/true

または--global

/bin/trueMacOSに存在しない場合は、代わりに/usr/bin/trueまたはを使用しますecho)。

次に、あなたが無視したいそれらのファイルに新しい差分ドライバを割り当てるあなたに.git/info/attributesファイル。

irrelevant.php    diff=nodiff

この状態が他の開発者と共有されることになっている場合は、.gitattributes代わりに使用して、(ドキュメントファイルなどを介して)ピアとコマンドを.git/info/attributes共有できますgit config


2
これはまさに私が探していたものです-kerneltrap.org/mailarchive/git/2008/10/17/3711254で説明されているように、〜/ .gitconfigを編集して追加しました: [diff "nodiff"] `command = / bin / true`そして、というファイルを作成しました追加した.git / info / attributes: irrelevant.php diff=nodiff
Michael

12
この答えは私のためにはるかに優れて働い:stackoverflow.com/questions/1016798/...
ニール・フォレスター

3
興味深いことに、このアプローチはでは機能しませんgit diff --stat。その場合、git diff ... | diffstat回避策として使用できます。
ddkilzer 2013年

@Michaelそのリンクは壊れているようですが、別のものはありますか?
DickieBoy 2015

3
単なる追加:とにかくgit diffに強制的に表示させたい場合は、次を使用します--no-ext-diff
Florian Klein

35

patchutilsプログラムコレクションのfilterdiffプログラムを使用して、diffの一部を除外することもできます。例えば:

git diff | filterdiff -p 1 -x db/irrelevant.php

4
-pは、manpage(1)から、「-pn、--strip-match = n一致する場合、パス名の最初のn個のコンポーネントを無視する」ことに注意してください。OPのパスからパーツを-p 1削除するのに気づくのにしばらく時間がかかりましたdb。ファイル名を指定し、パス/ディレクトリの可能性をすべて無視したい場合は、を使用できます-p 99
タイラーコリアー

32

この方法は、受け入れられた回答よりも短いです。

git diff 987200fbfb 878cee40ba --stat -- ':!*.cs'

さまざまな包含/除外の可能性の詳細については、この別の投稿を参照してください


フィルタは現在のディレクトリの下にあるすべてのファイルにのみ適用されることに注意してください。
キールテンブリンク

これが最良の答えでした。私はそれをもう少し単純化することができました:stackoverflow.com/a/58845608/3886183
dlsso

2
--statの部分を削除するか、少なくともそれが何を行うかを説明します。他の回答には含まれていないためです。
mix3d、

statフラグは、ファイルとその差分の合計を表示します。これにより、フィルターが意図したとおりに機能したかどうかを簡単に確認できます。
Chiel ten Brinke

17

この1行のソリューションでは、他のユーティリティやダウンロードは必要ありません。

git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-`

file/to/exclude.txtもちろん、除外したいファイルの名前はどこですか。

編集:差分を壊す削除されたファイルを修正するためのksenzeeを信用してください


私はあなたのワンライナーをgit diff --stat masterあまり成功せずに適応させようとしています-あなたは助けてもらえますか?
Mr_and_Mrs_D 2016

13

私がする必要があることに対して、KurzedMetalからの本当に良い答えです。それは、ファイルが変更されたことを確認する機能でしたが、私の場合、巨大である可能性のあるdiffを生成しませんでした。

しかし、私の同僚は、もっと簡単で効果的なアプローチを提案しました。

.gitattributes無視されるファイルがgit diff存在するディレクトリに、次の内容でファイルを追加します。

file-not-to-diff.bin -diff

それでもgit status、ファイルが変更されたかどうかを「確認」できます。git diffまた、ファイルが変更されたことを「確認」しますが、は生成しませんdiff

この.bin例のファイルの拡張子は、意図的なものです。これはバイナリファイルのgitのデフォルトの動作であり、での特別な処理は必要ないことを理解しています.gitattributes。しかし、私の場合、これらのファイルはgitおよび「file」ユーティリティによってテキストファイルとして認識され、これでうまくいきました。


11

最も簡単な答え

git diff ':!db/irrelevant.php'

これは':!<path to file>'、diffコマンドの直後です。diffコマンドは好きなだけ複雑にすることができます*.min.js。必要に応じて、ワイルドカードを使用したり、必要に応じて複数の除外(引用符で囲まれたブロックをスペースで区切る)を追加したりできます。


5

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

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

git diff -- ":(exclude)thingToExclude"

いくつかのワイルドカードを追加したいかもしれません

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

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

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

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

など、.bash_profileまたは.zshrc

gde() {
    # git diff exclude files or folders 
    # usage: 
    # gde fileOrFolderNameToExclude
    git diff -- ":(exclude)*/$1/*"
}

これは私にとってはうまくいきません、両方の構文で(exclude)または!を使用して、diffをまったく取得しません。私はgit 2.21.0を持っています
Olivvv

ステージングされていないファイルまたはステージングされたファイルのいずれかをgit diffできます。gitを追加した場合は、ステージングされます。彼らがステージングされている場合は、git diff --stagedこれがあなたを助けることを願っています。
jasonleonhard

構文的に、コロンは何をしていますか?
ヨナ

2

これは非常に簡単です。標準のUNIXコマンドを使用して、必要なものを除外できます。これらのコマンドは、Windows環境でもgit bashで使用できます。以下の例は、pom.xmlファイルのdiffを除外する方法を示しています。まず、diffをチェックしてファイル名のみをマスターし、次に不要な「grep -v」除外ファイルを使用してから、準備済みリストでマスターするためにdiffを再度実行します。

git diff master `git diff --name-only master | grep -v pom.xml`

1

ベンルーのソリューションに似ていますが、とにかく共有します。

git status --porcelain | grep -v $PATTERN_TO_EXCLUDE | awk '{print $2}' | xargs git diff

または、変更がすでにローカルでコミットされている場合:

git diff --name-only origin/master | grep -v $PATTERN_TO_EXCLUDE | xargs git diff origin/master

例:

git status --porcelain | grep -v docs | awk '{print $2}' | xargs git diff origin/master

git diff --name-only origin/master | grep -v docs | xargs git diff origin/master

1

私は次のことを行います:

git add *pattern_to_exclude*
git diff
git reset HEAD .

私はそれがエレガントな解決策ではないことを知っています、そしてそれは時々使用できません(例えばあなたがすでにものをステージングしている場合)、しかしそれは複雑なコマンドを入力する必要なしにトリックを行います


0

差分を視覚的に検査するためだけにこれを実行したい場合は、視覚的な差分ツール(Meldなど)を使用すると、覚えやすい短いコマンドで実行できます。

最初に、まだ行っていない場合は、diffツールを設定します。

$ git config --global diff.tool = meld

次に、ディレクトリの差分を実行できます。

$ git difftool --dir-diff

Meld(または選択したツール)で差分を(ファイルごとに)参照できます。無視したいファイルを開かないでください。

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