.gitignoreにないファイルを探す

.gitignoreにないファイルを探す

プロジェクトのファイルを表示する find コマンドがあります。

find . -type f -not -path './node_modules*' -a -not -path '*.git*' \
       -a -not -path './coverage*' -a -not -path './bower_components*' \
       -a -not -name '*~'

.gitignoreのファイルが表示されないようにファイルをフィルタリングする方法は?

私は以下を使用していると思いました。

while read file; do
    grep $file .gitignore > /dev/null && echo $file;
done

ただし、.gitignoreファイルはglobパターンを持つことができます(ファイルが.gitignoreにある場合はパスとは機能しません)。 globがある可能性のあるパターンに基づいてファイルをフィルタリングするにはどうすればよいですか?

答え1

git供給git-check-ignoreファイルが除外されていることを確認してください.gitignore

したがって、次のものを使用できます。

find . -type f -not -path './node_modules*' \
       -a -not -path '*.git*'               \
       -a -not -path './coverage*'          \
       -a -not -path './bower_components*'  \
       -a -not -name '*~'                   \
       -exec sh -c '
         for f do
           git check-ignore -q "$f" ||
           printf '%s\n' "$f"
         done
       ' find-sh {} +

スキャンはファイルごとに行われ、膨大な費用がかかります。

答え2

Gitが追跡するチェックアウトファイルを表示するには、次のようにします。

$ git ls-files

このコマンドには、キャッシュされたファイル、トレースされていないファイル、変更されたファイル、無視されたファイルなどの項目を表示するためのさまざまなオプションがあります。よりgit ls-files --help

答え3

これを行うgitコマンドがあります。

my_git_repo % git grep --line-number TODO                                                                                         
desktop/includes/controllers/user_applications.sh:126:  # TODO try running this without sudo
desktop/includes/controllers/web_tools.sh:52:   TODO: detail the actual steps here:
desktop/includes/controllers/web_tools.sh:57:   TODO: check if, at this point, the menurc file exists. i.e. it  was created

おわかりのように、ほとんどの一般的なgrepオプションを使用してデフォルトのgrepを実行しますが、ファイル.git内のファイルやフォルダは検索しません.gitignore
詳細については、次を参照してください。man git-grep

サブモジュール:

このgitリポジトリに別のgitリポジトリがある場合(サブモジュールにある必要がある場合)、このフラグを使用して--recurse-submodulesサブモジュールから取得することもできます。

答え4

bash globが実行される配列を使用できます。

次のファイルがあります。

touch file1 file2 file3 some more file here

そして、ignoreこのようなファイルがあります。

cat <<EOF >ignore
file*
here
EOF

使用

arr=($(cat ignore));declare -p arr

結果は次のとおりです。

declare -a arr='([0]="file" [1]="file1" [2]="file2" [3]="file3" [4]="here")'

その後、すべてのテクノロジを使用してこのデータを処理できます。

私は個人的に次のことを好みます。

awk 'NR==FNR{a[$1];next}(!($1 in a))'  <(printf '%s\n' "${arr[@]}") <(find . -type f -printf %f\\n)
#Output
some
more
ignore

関連情報