365

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

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

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

gitを実行するgit add folder/subfolder/file.txtと、無視されていると不平を言うことがあります。

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

6 に答える 6

734
git check-ignore -v filename

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

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

git は現在、このようなものを提供していません。しかし、あなたの質問を見てグーグルで調べたところ、2009 年にこの機能がリクエストされ、部分的に実装されていることがわかりました。スレッドを読んだ後、適切に行うのはそれほど大変ではないことに気付きました。そのため、パッチの作業を開始しました。1 日か 2 日以内に完了したいと考えています。準備ができたら、この回答を更新します。

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

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

更新 2:完了しました。上記のとおり、最新バージョンは github にあり、ピア レビューのためにパッチ シリーズを git メーリング リストに送信しました。彼らの考えを見てみましょう...

更新 3:さらに数か月のハッキング/パッチ レビュー/議論/待機の後、この機能が git のmasterブランチに到達し、次のリリース (1.8.2、8 日を予定) で利用可能になると言えることを嬉しく思います2013 年 3 月)。これがcheck-ignoreマニュアルページです。ふぅ、思った以上に大変な作業でした!

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

于 2012-08-28T21:58:17.123 に答える
6

そうではないかもしれません.gitignore-- 3 つの考えられる無視の理由

ファイルは、次の理由で無視される場合があります。

  1. .gitignore
  2. git update-index --skip-worktree
  3. git update-index --assume-unchanged

さらに、ファイルが.gitignoreインデックス/キャッシュにあり、かつ既にステージングされている場合、そのファイルは無視されない可能性があります。

上記の列挙されたケースを確認するには:

  1. .gitignore除外の 2 つのケースについて、次の出力を比較します。

    • git check-ignore --verbose --non-matching --no-index file1 file2 file3
    • git check-ignore --verbose --non-matching file1 file2 file3
  2. git ls-files file1 file2 file3 | grep -E '^S'

  3. git ls-files file1 file2 file3 | grep -E '^[[:lower:]]'

難しすぎます。エイリアスを教えてください。

次のエイリアスは、上記のすべてのケースをカバーします。

ignore = !"bash -c 'diff --unified=999999999 --color=always <(echo a; git check-ignore --verbose --non-matching --no-index . \"$@\") <(echo b; git check-ignore --verbose --non-matching . \"$@\")' - \"$@\" | tail -n+7; git hidden \"$@\" # Show ignore status of arguments. Files included by index are tagged with prepended '+'."
hidden = !"git ls-files -v -- \"$@\"| grep -E '^(S|[[:lower:]])' # S means update-index --skip-worktree, and lower first letter means --assume-unchanged."

コメントと最終"行は、にコピーする行の一部です.gitconfig

使用法:

git ignore file1 file2 file3
于 2020-08-13T09:27:28.963 に答える
4

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

test-add.sh STOP_DIR FILENAME

ここSTOP_DIRで、 は Git プロジェクトの最上位ディレクトリで、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 
于 2012-08-28T19:49:54.833 に答える