내 프로젝트의 파일을 표시하는 명령을 찾았습니다.
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