.gitignore에없는 파일 찾기


12

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

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

답변:


11

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

각 파일에 대해 검사가 수행 되었기 때문에 이에 대한 큰 비용을 지불해야합니다.


find-sh {} +말?
jcubic


좋아, 뭐야 find-sh?
jcubic

@jcubic 당신이 인라인 쉬 스크립트에 대한 준 이름 때문에 경우 오류가 발생, 당신은 의미있는 오류 메시지가 것입니다
cuonglm

@jcubic find /tmp -exec sh -c ': "${non_existed_var:?foo}"' find-sh {} +예를 들어 보십시오
cuonglm

9

이것을 정확하게하기위한 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를 사용 하여 서브 모듈에서도 검색 할 수 있습니다


현재 디렉토리에 다른 git repos가 있기 때문에 거의 작동하기 때문에 "* .git"이 있습니다.
jcubic

8

Checkout에 있고 Git에서 추적 한 파일을 표시하려면

$ git ls-files

이 명령에는 캐시 된 파일, 추적되지 않은 파일, 수정 된 파일, 무시 된 파일 등을 표시하기위한 여러 가지 옵션이 있습니다 git ls-files --help.


나는 또한 생각 git ls-files하지만 추적되지 않은 파일을 표시하는 옵션이 있다고 생각하지 않습니다.
cuonglm

1
@cuonglm -o(기타). 예 :git ls-files -o -X .gitignore
Kusalananda

예,하지만 파일이 이전에 추적되었지만에 포함 된 경우는 처리 할 수 ​​없습니다 .gitignore.
cuonglm

사소한 참고 : 이것은 시스템의 실제 파일이 아니라 git history에 포함 된 파일을 나열합니다. 대소 문자를 구분하지 않는 시스템 (예 : Windows 공유)에서 미묘한 차이가 될 수 있습니다. ./foo.txt를 커밋했지만 이름을 ./Foo.txt로 바꿉니다. 일부 자식 클라이언트는이 변화와 인식 할 수 없습니다 git ls-files./foo.txt 출력을하는 동안 find겠습니까 출력 ./Foo.txt
Griddo

2

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

gitignorebashglob의 상위 집합입니다 , 당신은 같은 것을 그리워합니다!file*
cuonglm

@cuonglm 무슨 뜻 !file*인가요? 파일을 무시하거나 파일 이름으로 glob 패턴으로 사용 하시겠습니까?
George Vasiliou

gitignore!file*시작하는 파일을 제외하는 파일 패턴을 수락 file하고 이중 별표**
cuonglm

.gitignorebash-scm.com/docs/gitignore 에는 Bash에서 직접 구현하기가 쉽지 않은 기능이 많이 있습니다. 단순한 globs와 구성 무시는 AWK하거나하지 않고, 일반 배쉬에서 행할 수 있어야하지만
ilkkachu

@cuonglm as의 번역을 의미 !합니까? 아마도 확장 된 globing이이 상황을 처리 할 수 ​​있습니다. doublestar에 대해서는 bash가 처리 할 수 ​​있습니다 shopt -s globstar.
George Vasiliou
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.