プロジェクト内のファイルを表示する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ファイルはグロブパターンを持つことができます(ファイルが.gitignoreにある場合、パスでも機能しません)。グロブを持つ可能性のあるパターンに基づいてファイルをフィルタリングするにはどうすればよいですか?
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 {} +
チェックはファイルごとに実行されるため、これには大きなコストがかかることに注意してください。
これを正確に行うための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
を使用してサブモジュールも検索できます。
チェックアウト中にあり、Gitによって追跡されているファイルを表示するには、次のコマンドを使用します。
$ git ls-files
このコマンドには、表示するためのいくつかのオプションがあります。キャッシュされたファイル、追跡されていないファイル、変更されたファイル、無視されたファイルなど。git ls-files --help
を参照してください。
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