.gitignoreによって無視される特定のファイルを表示するGitコマンド


645

私はGitで足を濡らしていますが、次の問題があります。

私のプロジェクトソースツリー:

/
|
+--src/
+----refs/
+----...
|
+--vendor/
+----...

ベンダーブランチにコード(現在はMEF)があり、そこでコンパイル/src/refsしてから、プロジェクトが参照を取得する場所に参照を移動します。

私の問題は、私は私の持っているということです.gitignore無視するように設定を*.dllして*.pdbgit add -f bar.dll無視できるファイルを強制的に追加することができますが、問題は、無視されているファイルが存在するかどうかを一覧表示できないことです。

無視されたファイルをリストして、それらを追加することを忘れないようにしたいと思います。

私はmanページを読んだのですがgit ls-files、動作させることができません。git ls-files --exclude-standard -i自分がやりたいことをやるべきだと私には思える。何が欠けていますか?


12
最近では、git-ls-filesを使用するのではなく、「git ls-files」を使用します
wojo

7
ここで示されているように、gitコマンドのみ(トリックを含む)を使用してこれを行う保証された方法がないことを認めているのは、リヤドの答えが正しいことを確認することです。また、実際には.gitignoreファイルには注意を払っていないため、要約の「exclude-from」の例には反対することをお勧めします。このページがGoogleのトップレスポンスであるため、特に質問します。git clean
アレクサンダーバード

「動作の概要」の要点:「Git ls-files」のマニュアルページでは、「-i」がls出力の除外ファイルを含めることを説明しています。「ゆっくり」と読むまで、私も同じように誤解していました。;-)
ます

2
回答は、質問の編集ではなく回答投稿に含める必要があります。
Flimm

私は持っていますgit config --global alias.ls ls-files --exclude-standard、そしてそれがこの質問への答えになりgit ls -iます。
jthill

回答:


662

ノート:


また興味深い(qwertymk回答で述べた)、git check-ignore -v少なくともUnixではコマンドを使用することもできます(CMD Windowsセッションでは機能しません)。

git check-ignore *
git check-ignore -v *

2つ目.gitignoreは、gitリポジトリでファイルを無視する実際のルールを表示します。
Unixでは、「現在のディレクトリ内のすべてのファイルに再帰的に展開するものは何ですか?」とbash4 +を使用します。

git check-ignore **/*

(またはfind -execコマンド)

注:https : //stackoverflow.com/users/351947/Rafi B.、(危険な)globstar回避するためにコメントで提案しています

git check-ignore -v $(find . -type f -print)

.git/ただし、サブフォルダーからファイルを必ず除外してください。


元の回答42009)

git ls-files -i

そのソースコードが示すことを除いて動作するはずです

if (show_ignored && !exc_given) {
                fprintf(stderr, "%s: --ignored needs some exclude pattern\n",
                        argv[0]);

exc_given

-i実際に何かを一覧表示するには、の後にもう1つのパラメーターが必要であることがわかります。

試してください:

git ls-files -i --exclude-from=[Path_To_Your_Global].gitignore

(ただし、フィルターされたキャッシュされた(無視されない)オブジェクトのみが一覧表示れるため、希望どおりではありません)


例:

$ cat .git/ignore
# ignore objects and archives, anywhere in the tree.
*.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
$ git ls-files --ignored \
    --exclude='Documentation/*.[0-9]' \
    --exclude-from=.git/ignore \
    --exclude-per-directory=.gitignore

実際、私の 'gitignore'ファイル( 'exclude'と呼ばれています)で、次のようなコマンドラインが見つかります。

F:\prog\git\test\.git\info>type exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~

そう....

git ls-files --others --ignored --exclude-from=.git/info/exclude
git ls-files -o -i --exclude-from=.git/info/exclude

git ls-files --others --ignored --exclude-standard
git ls-files -o -i --exclude-standard

トリックを行う必要があります。

で述べたように、LS-ファイルのmanページ--others非キャッシュ、非コミット、通常、無視されたファイルをお見せするために、重要な部分です。

--exclude_standardは単なるショートカットではなく、標準の「無視されるパターン」設定をすべて含める方法です。

exclude-standard
標準のGit除外を追加します:.git/info/exclude.gitignore各ディレクトリ、およびuser's global exclusion file


@VocC、これらのテストの私の理解から、あなたが一番上であなたが推薦する答えは単に大きな欠陥を持つことができます。そのため、通常は代わりにリヤドの回答をお勧めします。
アレクサンダーバード

2
Gitのv2.13.2リリース以来:git status --ignoredそれはまた、人跡未踏のファイルを示しているようだ:github.com/git/git/blob/master/Documentation/RelNotes/...
ポー

1
すごい、git check-ignore -v *設定がどこに適用されたかを示すので、うまくいきます。ありがとうございました。
ホアントラン2017

@MikeD * /を機能させるには(実際には**を実行するだけです)、globstarを設定してshopt -s globstarから機能させる必要があります。
Veda

(危険な)globstarを有効にしない場合:git check-ignore -v $(find . -type f -print)
rafi

484

もっと簡単な方法があります(git 1.7.6+):

git status --ignored

参照.gitignoreファイルの影響を無視するようにgit-状況を伝える方法はありますか?


3
使用しているgitのバージョンは何ですか?鉱山(1.7.0.4)は言うerror: unknown option 'ignored'-sリンクされた投稿で提案されているように追加しても機能しませんでした。
Alexander Bird

3
私のバージョンは1.7.6です。別のバージョン1.7.5.1が必要なバージョンです-s。サポートさgit status -hれているかどうかを確認してみてください--ignored
Penghe Geng

1
1.7.0.4ではまだサポートされていないようです。私の他のコンピューターには1.7.9があり、-ignoredフラグがあります
Alexander Bird

4
私はこのページのすべての解決策を試しました。これは最高です。ファイルとディレクトリの両方が表示されます。この質問が最初に尋ねられたとき、この機能はおそらく利用できませんでした。(ちなみに、すべてのソリューションは、少なくとも段階的な変更が
完了

12
これは確かに受け入れられた答えよりもはるかに優れています。git clean -ndX追跡されていないファイルが削除されるため、フラグを誤って忘れたというまれな状況がリポジトリに取り返しのつかない影響を与えるため、これはソリューションよりもはるかに安全です。危険です。逆にgit status --ignored、誤って入力した場合でも常に安全であり、覚えておくのは当然です。
Ioannis Filippidis 2013

400

かなりクリーンな別のオプション(しゃれた意図はありません。):

git clean -ndX

説明:

$ git help clean

git-clean - Remove untracked files from the working tree
-n, --dry-run - Don't actually remove anything, just show what would be done.
-d - Remove untracked directories in addition to untracked files.
-X - Remove only files ignored by Git.

注:このソリューションでは、すでに削除されている無視されたファイルは表示されません。


気の利いた...しかし、元の質問をした理由は、そこにあるはずのベンダーファイル(* .dll)が存在することを確認できるようにするためでした...それらを削除しても、望ましい結果にはなりません。ただし、*。dllを無視することから、ビルド出力フォルダー(ただし、ベンダーフォルダーではない)を無視するように戦略を変更したため、これは知っておくと役に立ちます。これはmake clean、ビルドサーバーの優れた代替手段であり、非常に役立ちます。
アンドリューバーンズ

2
私はgitバージョン1.7.0.4を使用していますが、2つのコマンド( 'git ls-files -o -i --exclude-standard'、 'git clean -dXn')は同等ではありません。最初は4つのファイルを示し、2つ目は2つのファイルのみを示します。(.gitignore〜、index.php〜、sql / create_users.sql〜、www / index.php〜)(.gitignore〜を削除します、index.php〜を削除します)。私はここで何かミスをしていますか?
セザール

@VonC、甘い!ありがとう!@Cesar、わかりません。私はあまり詳しくありませんgit ls-files -o -i --exclude-standardgit clean -dXn常に私が欲しかったものですが、すでに削除された無視されたファイルは表示されません。git ls-files -o -i --exclude-standardそうするかもしれません。だから、それが違いを引き起こしているのかもしれません。
ma11hew28

3
小さなことの1つ- n最初にタイプするのは良い考えかもしれません。git clean -ndX
Tobias Cohen、

1
@tobiasCohenいいね!私はあなたの提案で答えを更新しました。安全です。ただし、をn省略した場合、Gitのデフォルトはになりfatal: clean.requireForce defaults to true and neither -n nor -f given; refusing to cleanます。それでもかなり安全ですが、n最初のタイプの方が安全です。:)
ma11hew28

39

一般的に正しい解決策がすべての状況で機能するとは限りません。次のようなrepo dirを想定します。

# ls **/*                                                                                                       
doc/index.html  README.txt  tmp/dir0/file0  tmp/file1  tmp/file2

doc:
index.html

tmp:
dir0  file1  file2

tmp/dir0:
file0

そして、このような.gitignore:

# cat .gitignore
doc
tmp/*

これは、docディレクトリとその下のすべてのファイルを無視しますtmp。Gitは期待どおりに機能しますが、無視されたファイルをリストするための指定されたコマンドは機能しません。gitの発言を見てみましょう。

# git ls-files --others --ignored --exclude-standard                                                            
tmp/file1
tmp/file2

docリストから欠落していることに注意してください。あなたはそれを得ることができます:

# git ls-files --others --ignored --exclude-standard --directory                                                
doc/

追加の--directoryオプションに注意してください。

私の知識から何もありません1つの一度にすべて無視されたファイルを一覧表示するコマンド。しかし、なぜtmp/dir0がまったく表示されないのかはわかりません。


2
これは私が欲しかったものを私に手に入れましたが、他の人は(私の特定のケースでは)そうではありませんでした...ありがとう!2つのコマンドを実行する必要があるのはイライラしますが、無視されたディレクトリで、-directoryオプションは少なくともそれを見つけて、それをfindコマンドにパイプしてファイルを見つけることができます。ありがとう!
lindes

これは、すべて一度に行い、ディレクトリを以下のように拡張します(git ls-files -oi --exclude-standard; git ls-files -oi --exclude-standard --directory) | perl -nle '$seen{$_}++||next;if(-d){system"find",$_,"-type","f"}else{print}'
ディーNewcum

17

Gitにはこの機能が組み込まれています

git check-ignore *

もちろんグロブを**/*.dllあなたの場合のようなものに変更することができます

Gitリファレンス


7
git check-ignore **/*サブディレクトリにファイルを含める
mzimmer 2015年

これはトップレベルのディクトリクトのみをリストします。
Radon8472 2017

13

使用するのに十分でなければなりません

git ls-files --others -i --exclude-standard

それがカバーするすべてをカバーするので

git ls-files --others -i --exclude-from=.git/info/exclude

したがって、後者は冗長です。


~/.gitconfigファイルに エイリアスを追加することで、これを簡単にすることができます。

git config --global alias.ignored "ls-files --others -i --exclude-standard"

入力git ignoredするだけでリストを表示できます。覚えるのがはるかに簡単になり、タイプするのが速くなります。

Jason Gengのソリューションをより簡潔に表示したい場合は、次のようにエイリアスを追加できます。

git config --global alias.ignored "status --ignored -s"

ただし、詳細な出力は、無視されたすべてのcotton-pickin 'ファイルを一覧表示するため、.gitignoreファイルの問題のトラブルシューティングに役立ちます。通常、結果をパイプ処理して、grep無視することが予想されるファイルがそこにあるかどうか、または無視したくないファイルがそこにあるかどうかを確認します。

git ignored | grep some-file-that-isnt-being-ignored-properly

次に、短いディスプレイを見たいだけの場合、覚えて入力するのは簡単です。

git status --ignored

-s通常は省略できます。)


これらのファイルを手動でリストする必要があるため、これは私にとってはうまくいきませんでした。git status --ignoredDebian sidで動作しますが、非常に新しい可能性がありますが、人気の需要により追加されたようです;-)
mirabilos

1
「Debian sidで動作する」とは、「Debian sidにデフォルトでインストールされているGitのバージョンで動作する」という意味ですか?ディストリビューションに含まれているユーティリティのバージョンに人質にさせられないようにする必要があります。ディストリビューション自体とは別に、それらをアップグレードできます。
iconoclast 2018年

12

Gitの複数のgitignoreソース(GNUを使用している場合)のどこかにあるパターンに一致する作業ツリー内のファイルの完全なリストを印刷する方法は次のとおりですfind

$ cd {your project directory}
$ find . -path ./.git -prune -o -print \
| git check-ignore --no-index --stdin --verbose

リポジトリの現在のブランチにあるすべてのファイルをチェックします(ローカルで削除していない場合)。

また、特定のgitignoreソース行も識別します。

Gitは、gitignoreパターンに一致する一部のファイルの変更を追跡し続けます。これは、これらのファイルが既に追加されているためです。便利なことに、上記のコマンドはそれらのファイルも表示します。

負のgitignoreパターンも一致します。ただし、これらはで始まるため、リストでは簡単に区別できます!

Windowsを使用している場合、Git BashにはGNUが含まれていますfind(で明らかにされていますfind --version)。

リストが長い(そしてを持っているrev)場合は、拡張子で(やや)表示することもできます。

$ cd {your project directory}
$ find . -path ./.git -prune -o -print \
| git check-ignore --no-index --stdin --verbose \
| rev | sort | rev

詳細については、参照man findman git-check-ignoreman rev、とman sort

この全体的なアプローチの要点は、Git(ソフトウェア)が急速に変化し、非常に複雑であるということです。対照的に、GNU find非常に安定しています(少なくとも、ここで使用されている機能では)。したがって、Gitに関する深い知識を示すことで競争力を高めたいと考えている人は、別の方法で質問に答えます。

最良の答えは何ですか?この回答は、モジュール性(情報の分離)を通じて安定性とシンプルさの目標を達成するために、意図的にGit知識への依存を最小限に抑え、長期間続くように設計されています。


どうもありがとう!新しいソースファイルの一部がコミットから失われることがある理由を理解するのに苦労していました。bin *というパターンがあったことがわかりました。これは、binで始まるファイル/ディレクトリの名前のみに一致すると考えていましたが、ファイル/ディレクトリの完全パスにbinを含むすべてに一致します。おそらく、私の問題は.gitignoreでのパターンマッチングの正確なセマンティクスの誤解によるものだと思います。2行のスクリプトは、この間違いを見つけるのに役立ちました。
Nicolas Rouquette 2015

1

(他の答えを拡張する)

注:作業ツリー内のものではなくgit check-ignore、コミット済みのもの.gitignoreを使用します!gitの履歴を汚染せずにそれを試すには、自由に編集してから、でコミットしますgit commit --amend

この問題は主に、gitがディレクトリを追跡しないという問題の回避策が必要な場合に発生します。に入力してください.gitignore

dirtokeep/**
!dirtokeep/.keep

.keepでは、長さがゼロのファイルである必要がありますdirtokeep

結果はとなり、すべてではdirtokeep、無視されます除く外 dirtokeep/.keepもいることなり、dirtokeepディレクトリがクローン/チェックアウト上に構築されます。


0

いくつかの無視するディレクトリがあると仮定して、追加するファイルを通知する「git status node / logs /」を使用しないのはなぜですか?ディレクトリに、ステータス出力の一部ではないテキストファイルがあります。例:

ブランチマスター上
ブランチは 'origin / master'で最新です。
追跡されていないファイル:(
「git add ...」を使用して、コミット対象に含めます)

    node/logs/.gitignore 

.gitignoreは:

*

!.gitignore

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