web-dev-qa-db-ja.com

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

私は足をgitで濡らしていて次のような問題があります

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

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

私は自分のベンダーブランチにコード(現在はMEF)があり、そこでコンパイルしてから参照を/src/refsに移動します。ここでプロジェクトがそれらを拾います。

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

私はそれらを追加することを忘れないようにするために無視されたファイルをリストしたいです。

私はgit ls-filesのmanページを読みましたが、動かせません。 git ls-files --exclude-standard -iが私が望むことをするべきだと私には思えます。何が足りないの?

546
Andrew Burns

ノート:


また興味深い( qwertymk s answer に記載)、 git check-ignore -v コマンドも使えます。少なくともUnixでは( 動作しません CMDでは Windows セッション)

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

2番目のものはあなたのgitリポジトリで無視されるファイルを作る.gitignoreの実際のルールを表示します。
Unixでは、 " を使うとカレントディレクトリの全ファイルに再帰的に展開する? "とbash4 +:

git check-ignore **/*

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


元の回答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-filesのmanページ で述べたように、--othersは、キャッシュされていない、コミットされていない、通常は無視されるファイルを表示するための重要な部分です。

--exclude_standardは単なるショートカットではありませんが、all standardの「無視パターン」設定を含める方法です。

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

544
VonC
390
Penghe Geng

かなりきれいなもう一つのオプション(駄洒落は意図されていません):

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.

注:この解決方法では、既に削除されている無視されたファイルは表示されません。

386
ma11hew28

一般的には正しいですが、あなたの解決策はすべての状況で動作するわけではありません。このようなレポジトリを仮定します。

# 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がまったく表示されないのかわかりません。

38
riyad

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

git check-ignore *

もちろん、あなたはglobを**/*.dllのようなものに変更することができます。

Gitリファレンス

17
qwertymk

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のfindextremestableです(少なくともここで使用されている機能において)。そのため、Gitについての深い知識を表示して競争力を高めたいという人は、別の方法で質問に答えます。

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

9
MarkDBlackwell

(他の答えを拡張する)

git check-ignoreはコミット済みの.gitignoreを使用し、作業ツリーのものを使用しません。あなたのgit履歴を汚染することなくそれで遊ぶために、あなたはそれを自由に編集しようと試みるかもしれませんそしてそれからgit commit --amendでコミットします。

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

dirtokeep/**
!dirtokeep/.keep

.keepdirtokeepname__内の長さゼロのファイルでなければなりません。

その結果、dirtokeepname__内のeverythingは無視され、dirtokeep/.keepを除いて、dirtokeepname__も無視されます。クローン/チェックアウト時にディレクトリが作成されます。

1
peterh

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

支店主
あなたのブランチは 'Origin/master'で最新の状態になっています。
未追跡ファイル:
(コミットする内容に含めるには "git add ..."を使用してください)

    node/logs/.gitignore 

.gitignoreは次のとおりです。

*

!. gitignore

0
pikknz