[unix] .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가있을 수있는 패턴을 기반으로 파일을 필터링하려면 어떻게해야합니까?



답변

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 repo 안에 다른 git repos가 있다면 (서브 모듈에 있어야 함) 플래그 --recurse-submodules를 사용 하여 서브 모듈에서도 검색 할 수 있습니다


답변

Checkout에 있고 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


답변