プロジェクトのファイルを表示する 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