ファイルを無視しているgitignoreルールを説明する


310

gitによって一部のファイルが無視されている理由を確認する方法はありますか(つまり、.gitignoreファイル内のどのルールがファイルを無視しているのか)。

私がこれを持っていると想像してください(または、数百のフォルダと数十の.gitignoreファイルを含むはるかに複雑なシナリオ:

/
-.gitignore
-folder/
    -.gitignore
    -subfolder/
              -.gitignore
              -file.txt

私がgit add folder/subfolder/file.txtgit を実行すると、無視されたと文句を言うかもしれません:

The following paths are ignored by one of your .gitignore files:
folder/subfolder/file.txt
Use -f if you really want to add them.

.gitignoreこのファイルを無視するルールがあり、ルールを表示する方法はありますか?お気に入り:

The following paths are ignored by your folder/.gitignore file (line 12: *.txt)
folder/subfolder/file.txt
Use -f if you really want to add them.

あるいは単に:

$ git why-is-ignored folder/subfolder/file.txt
folder/.gitignore:12:*.txt

4
注:git check-ignore間もなく(git1.8.5 / 1.9)--no-indexオプションが追加されます。以下の私の回答を
VonC

注:ルールGIT_TRACE_EXCLUDE=1 git statusをデバッグするためのもう1つの方法になり.gitignoreます。以下の私の編集済みの回答を
VonC

関連するブログ投稿:danielcompton.net/2016/04/21/…
krlmlr

回答:


643
git check-ignore -v filename

詳細については、manページ参照してください。

元の答えは次のとおりです:

gitは現在、このようなものを提供していません。しかし、あなたの質問を見た後、私はいくつかグーグルを行い、2009年にこの機能が要求され、部分的に実装されていることに気付きました。スレッドを読んだ後、それを適切に行うにはそれほど多くの作業ではないことがわかったので、私はパッチの作業を開始し、翌日または2日で完了することを望んでいます。準備ができたらこの回答を更新します。

更新:うわー、それは私が予想したよりもはるかに困難でした。gitの除外処理の内部は非常に不可解です。とにかく、今日のアップストリームブランチに適用されるほぼ完成した一連のコミット次に示しますmaster。テストスイートは99%完了してい--stdinますが、オプションの処理はまだ完了していません。うまくいけば、今週末にそれを管理し、私のパッチをgitメーリングリストに送信します。

それまでの間、そうすることができる人なら誰でもテストを歓迎します。私のgitフォークからクローンを作成し、check-ignoreブランチをチェックアウトして、通常どおりにコンパイルしてください。

更新2:完了しました!上記のように最新バージョンはgithubにあり、ピアレビューのためにgitメーリングリストにパッチシリーズを提出しました。彼らがどう思うか見てみましょう...

更新3:数か月にわたるハッキング/パッチレビュー/ディスカッション/待機の後、この機能がgitのmasterブランチ到達し、次のリリース(1.8.2、8日予定)で利用できるようになったことを嬉しく思います2013年3月)。こちらがcheck-ignoreマニュアルページです。ふー、それは私が予想したよりもずっと多くの仕事でした!

更新4:この答えがどのように進化し、機能が実装されるようになったかについての全話に興味がある場合は、GitMinutesポッドキャストのエピソード#32をチェックしてください。


2
1.8.2を使用git check-ignoreしていますが、何もしません。
ザクダンス2013

3
@yourfriendzakは疑いの余地なく、git check-ignore1.8.2に存在し、機能しています。動作が期待と異なる場合は、マニュアルページを(再)読むことをお勧めします。そうでない場合は、gitメーリングリストで適切なバグレポートを送信してください。何もしないと言ってもあまり役に立ちません。私はあなたがおそらく無視されていないファイルでそれを実行し、誤っていくつかの出力を期待していると思います(将来的--show-unmatchedには--verbose出力モードのサポートをおそらく追加するでしょう)。
Adam Spiers 2013

1
@AdamSpiersあなたが正しい。コマンドを実行しても何も出力されないことを指定する必要がありました。エラーメッセージ、成功メッセージ、情報はありません。次の空白のプロンプトが表示されます。では、特定の状況で「出力なし」が予想される動作であると想定するのは正しいですか
ザクダンス2013

1
@AdamSpiersありがとうございます!3日間の調査の後、あなたは私が.gitignore_globalのグローバルに無視されたファイルが原因でビルドが壊れる原因を追跡するのを手伝ってくれました!それさえも知らなかった!
BenBtg 2018

3
Stack Overflow開発者が開発者向け機能を実装するために非常に多くの変更を加えるのを目にするのは日常的なことではありません。うわーと尊敬。
user3613932

18

git 2.8を更新(2016年3月):

GIT_TRACE_EXCLUDE=1 git status

「を参照してください。検証への道.gitignoreファイルを

これは、git check-ignore -v以下で説明する補足です。


元の回答:2013年9月(git 1.8.2、次に1.8.5以降):

git check-ignoregit 1.8.5 / 1.9(2013年第4四半期)で再び改善:

git check-ignore」は「git add」および「」と同じルールに従いますgit statusが、無視/除外メカニズムはすでに追跡されているパスには影響しません。
--no-index」オプションを使用すると、無視されるべきパスが誤ってインデックスに追加されたパスを診断するために使用できます

コミット8231fa6を参照https://github.com/flashydaveからをしてください

check-ignore 現在の方法を示しています .gitignoreルールは追跡されていないパス扱うます。追跡されたパスは、有用な出力を生成しません。
これにより、パスが最初にでインデックスから削除されない限り、パスが予期せず追跡された理由のデバッグが防止されますgit rm --cached <path>

このオプション--no-indexは、インデックスにあるパスのチェックをバイパスするようにコマンドに指示するため、追跡されたパスもチェックできます。

この動作は、 git addgit statusその使用例はユーザーの混乱を招くことはほとんどありません。

テストスクリプトは、このオプションを標準の無視に対してチェックして、正しい動作を保証するように拡張されています。


--no-index::

チェックを行うときにインデックスを調べないでください。
これは使用できます:

  • パスがたとえばによって追跡git add .され、ユーザーによって期待されたルールによって無視されなかった理由をデバッグする
  • 以前にで追加されたパスと一致する否定を含むパターンを開発するときgit add -f

4

manページには何も見つかりませんが、git-addできるかどうかを確認するために、各親ディレクトリ内のファイルをチェックする簡単なスクリプトを次に示します。問題のあるファイルを含むディレクトリで次のように実行します。

test-add.sh STOP_DIR FILENAME

どこSTOP_DIRGitプロジェクトのトップレベルのディレクトリであり、FILENAME(パスを含まない)問題のファイル名です。階層の各レベルに同じ名前の空のファイルを作成し(存在しない場合)、git add -n追加できるかどうかを確認します(それ自体がクリーンアップされます)。それは次のようなものを出力します:

FAILED:    /dir/1/2/3
SUCCEEDED: /dir/1/2

スクリプト:

#!/usr/bin/env bash
TOP=$1
FILE=$2
DIR=`pwd`
while : ; do
  TMPFILE=1
  F=$DIR/$FILE
  if [ ! -f $F ]; then
    touch $F
    TMPFILE=0
  fi
  git add -n $F >/dev/null 2>&1
  if [ $? = 0 ]; then
    echo "SUCCEEDED: $DIR"
  else
    echo "FAILED:    $DIR"
  fi
  if [ $TMPFILE = 0 ]; then
    rm $F
  fi
  DIR=${DIR%/*}
  if [ "$DIR" \< "$TOP" ]; then
    break
  fi
done 

1

使用の主な答えに加えてgit check-ignore -v filename(BTWに感謝)ワイルドカードの後に​​改行があるため、.gitignoreファイルがすべてをブロックしていることがわかりました。

* .sublime-project

例として。改行を削除したところ、出来上がり!修正されました。

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