.gitignore에 없는 파일 찾기

.gitignore에 없는 파일 찾기

내 프로젝트의 파일을 표시하는 명령을 찾았습니다.

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 repo 내에 다른 git repos가 있는 경우(하위 모듈에 있어야 함) 플래그를 사용하여 --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

관련 정보