web-dev-qa-db-ja.com

.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ファイルはグロブパターンを持つことができます(ファイルが.gitignoreにある場合、パスでも機能しません)。グロブを持つ可能性のあるパターンに基づいてファイルをフィルタリングするにはどうすればよいですか?

11
jcubic

gitgit-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 {} +

チェックはファイルごとに実行されるため、これには大きなコストがかかることに注意してください。

11
cuonglm

これを正確に行うための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を使用してサブモジュールも検索できます。

9
the_velour_fog

チェックアウト中にあり、Gitによって追跡されているファイルを表示するには、次のコマンドを使用します。

$ git ls-files

このコマンドには、表示するためのいくつかのオプションがあります。キャッシュされたファイル、追跡されていないファイル、変更されたファイル、無視されたファイルなど。git ls-files --helpを参照してください。

8
Kusalananda

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
2
George Vasiliou