762

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

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

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

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

私の問題は、.gitignore無視するように設定し*.dllていること*.pdbです。無視されたファイルを強制的に追加することはできますがgit add -f bar.dll、問題は、無視されたファイルが存在するかどうかをリストできないことです。

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

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

4

12 に答える 12

829

ノート:


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

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

.gitignore2 つ目は、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/ただし、サブフォルダーからファイルを必ず除外してください。

CervEd、コメントで次のことを回避することを提案してい.git/ます。

find . -not -path './.git/*' | git check-ignore --stdin

元の回答 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 --ignored --exclude-from=.git/info/exclude
git ls-files -i --exclude-from=.git/info/exclude

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

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

(キャッシュされたファイルが含まれていないことをコメントで指摘してくれたhonzajdeに感謝します: ( without ) のみが含まれます。)git ls-files -o -i --exclude-from...git ls-files -i --exclude-from... -o

ls-files のマニュアル ページに記載されているように、--othersキャッシュされておらず、コミットされておらず、通常は無視されるファイルを表示するために重要な部分です。

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

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

于 2009-01-21T21:17:24.157 に答える
608

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

git status --ignored

git-status に .gitignore ファイルの影響を無視するように指示する方法はありますか? を参照してください。

于 2012-08-22T20:29:34.763 に答える
409

かなりきれいな別のオプション(しゃれは意図されていません。):

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.

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

于 2010-02-04T01:17:55.293 に答える
41

一般的に正しいソリューションですが、すべての状況で機能するとは限りません。次のようなリポジトリ ディレクトリを想定します。

# 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追加オプションに注意してください。

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

于 2009-09-18T20:14:04.557 に答える
19

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

git check-ignore *

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

Git リファレンス

于 2014-10-27T01:52:22.397 に答える
16

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 (ソフトウェア) が急速に変化しており、非常に複雑であるということです。対照的に、GNUfind非常に安定しています (少なくとも、ここで使用されている機能では)。したがって、Git に関する深い知識を示すことで競争力を高めたいと考えている人は、別の方法で質問に答えるでしょう。

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

于 2015-08-28T15:24:06.420 に答える
15

使用するのに十分なはずです

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"

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

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

次に、短い表示を見たいだけの場合は、覚えて入力するだけで十分簡単です

git status --ignored

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

于 2012-08-31T18:15:37.550 に答える
1

私はただするだろう

git status --porcelain --ignored

無視されたファイルのみをリストする

git status --porcelain --ignored | grep '^[!][!] '
于 2021-10-14T11:43:46.953 に答える
0

これらのファイルを手動で削除して、プロジェクトから GIT 以外のファイルを完全に削除したい場合は、次を実行できます。

rm -rf $(git status --ignored)

警告: これにより、 によって返された任意のファイルとディレクトリが強制的に削除git status --ignoredされます。自分の判断で、自分が何をしているのかを知っている場合にのみ使用してください。

于 2021-04-15T10:06:37.717 に答える