1. ホーム
  2. git

[解決済み] 現在ステージングまたはコミットされているファイルで、git が無視するものをリストアップする方法は?

2023-05-21 02:53:16

質問

.gitignoreファイルのルールにマッチし、かつ過去にステージングまたはコミットされたファイルのリストを取得するにはどうしたらよいでしょうか。

どのように解決するのですか?

のドキュメントは ls-files に対するドキュメントは必ずしも明確に書かれているわけではありませんが、以下のような単純なエイリアスがその役目を果たしているようです。

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

上記のコマンドは showtrackedignored . 使用するには、実行します。

git showtrackedignored

を実行すると、カレントディレクトリとサブディレクトリにある、追跡されているが、追跡されていなければ無視されるようなファイルをすべてリストアップします。

のバグ git ls-files

残念ながら、これは100%確実に動作するわけではありません。 どうやら、Git は ではなく を無視するファイルを見つけるのはうまくいきますが は無視されます( -i のオプションは git ls-files ) を使用すると、無視のルールにマッチしたディレクトリであれば、 ディレクトリ内の無視されるファイルをリストアップしないようになります。

このバグを回避するには、無視ルールを変換して、ディレクトリではなくファイルのみにマッチするようにしてください (これは常に可能というわけではありません)。

(ありがとうございます クリストフ このバグを発見してくれた Git メーリングリストに報告してくれました。 ! 編集:パッチは現在作成中で、git 1.7.11.2 以降に反映させる予定です)

別のアプローチ

別のアプローチを紹介します。 これははるかに複雑で、コーナーケースが壊れている可能性があります。

git config --global alias.showtrackedignored '!
cd "${GIT_PREFIX}" &&
untracked_list=$(git rev-parse --git-dir)/ignored-untracked.txt &&
git ls-files -o -i --exclude-standard >"${untracked_list}" &&
GIT_INDEX_FILE="" git ls-files -o -i --exclude-standard | grep -Fvxf "${untracked_list}" &&
rm -rf "${untracked_list}"'

エイリアスは次のような働きをします。

  • cd のあるディレクトリに戻り git showtrackedignored が実行されたディレクトリに戻ります(Gitはシェルベースのエイリアスをカレントディレクトリではなく、トップレベルディレクトリから実行します。 alias.* のセクションをご覧ください。 git help config )
  • という変数を定義します。 untracked_list . この変数は、現在無視されているファイルのリストを格納する一時ファイルへのパスを保持します。 この一時ファイルは .git ディレクトリにあります。
  • 無視されるファイルのリストを ${untracked_list} .
  • インデックスが空であるかのように振る舞い、無視されたファイルをすべてリストアップするようにGitに指示します。
  • その出力をパイプで grep に書き込まれたファイルをフィルタリングします。 ${untracked_list} .
  • 一時ファイルを削除する ${untracked_list} .

この方法の欠点

  • の中に一時ファイルを作成します。 .git ディレクトリに一時ファイルを作成します。
  • POSIX互換のシェルがあることを前提にしています。
  • のPOSIX互換の実装があることを前提としています。 grep .

また、以前のエイリアスと同じバグに悩まされています。