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