?를 사용하여 자식 저장소를 검색 할 때 특정 경로 / 디렉토리 / 파일을 제외시키는 방법이 git grep
있습니까? --exclude
일반 grep
명령 의 옵션 과 비슷한 것이 있습니까?
큰 자식 저장소에서 직접 git grep
사용 grep
하는 것이 너무 느리기 때문에 사용해야 합니다.
?를 사용하여 자식 저장소를 검색 할 때 특정 경로 / 디렉토리 / 파일을 제외시키는 방법이 git grep
있습니까? --exclude
일반 grep
명령 의 옵션 과 비슷한 것이 있습니까?
큰 자식 저장소에서 직접 git grep
사용 grep
하는 것이 너무 느리기 때문에 사용해야 합니다.
답변:
가능하지는 않지만 최근에 논의되었습니다 . 링크에서 제안 된 해결 방법 :
*.dll
그런 다음 .gitignore 파일에 넣을 수 있습니다git grep --exclude-standard
.
EDIT 볼 onlynone의 답변을 자식 1.9.0이 가능이기 때문에.
자식 1.9.0에서는 "마술 단어" exclude
가 pathspec
s 에 추가되었습니다 . 따라서 foobar
일치하는 파일을 제외한 모든 파일 을 검색 *.java
하려면 다음을 수행하십시오.
git grep foobar -- './*' ':(exclude)*.java'
또는 !
"짧은 형식"을 사용하여 제외하십시오.
git grep foobar -- './*' ':!*.java'
v2.12까지의 git 버전에서는 exclude를 사용할 때 pathspec
하나 이상의 "inclusive"가 있어야합니다 pathspec
. 위의 예에서 이것은 ./*
(현재 디렉토리 아래의 모든 것을 재귀 적으로 포함) git v2.13에서는이 제한이 해제 git grep foobar -- ':!*.java'
되어 ./*
.
:(top)
(짧은 형식 :)과 같은 것을 사용 :/
하여 리포지토리의 상단에서 모든 것을 포함 할 수 있습니다 . 그러나 제외 pathspec
를 맨 처음부터 시작 하도록 조정하고 싶을 수도 있습니다 :/!*.java
(그렇지 않으면 *.java
현재 디렉토리 아래의 파일 만 제외 합니다).
git-scm.com (또는 그냥 ) pathspec
에서 허용되는 모든 "마법의 단어"에 대한 좋은 참고 자료가 있습니다 . 어떤 이유로 kernel.org 의 문서는 종종 Google 검색에서 처음 등장하지만 실제로 최신 버전이 아닙니다.git help glossary
git grep clock.gettime -- './*' ':!arch/**' ':!drivers/**'
여러 개의 전체 디렉토리를 제외합니다. 그래도 재귀를 막을 수는 없다고 생각합니다.
git config alias.mygrep '!git grep "$@" -- "${GIT_PREFIX}/*" ":!*.java*" #'
. 그럼 그냥 git mygrep foobar
. (alias shell # trick and current dir 사용 )
git grep
와 git ls-files
현재 디렉토리를 기준으로 하위 디렉토리 모두 보고서 파일 이름에서 (당신이 사용하는 경우에도이 ':(top)'
pathspec 포함). 두 명령 모두 --full-name
루트에 상대적인 이름을보고 하는 옵션이 있지만 기본적으로 해제되어 있습니다.
업데이트 : git> = 1.9의 경우 제외 패턴에 대한 기본 지원이 있습니다 ( oneone 's answer 참조) .
이것은 거꾸로 보일지 모르지만 제외 패턴 git grep
과 일치하지 않는 파일 목록을 다음 과 같이 전달할 수 있습니다 .
git grep <pattern> -- `git ls-files | grep -v <exclude-pattern>`
grep -v
일치 하지 않는 모든 경로를 반환합니다 <exclude-pattern>
. 참고 git ls-files
도 소요 --exclude
매개 변수를하지만 단지에 적용되는 비 추적 파일 .
저장소에 속성 파일을 작성하여 파일 또는 디렉토리를 2 진으로 표시 할 수 있습니다 (예 :
$ cat .git/info/attributes
directory/to/ignore/*.* binary
directory/to/ignore/*/*.* binary
another_directory/to/also/ignore/*.* binary
이진 파일의 일치 항목은 포함 줄없이 나열됩니다 (예 :
$ git grep "bar"
Binary file directory/to/ignore/filename matches
other_directory/other_filename: foo << bar - bazz[:whatnot]
@kynan의 예제를 기본으로 사용 하여이 스크립트를 만들고 경로 ( ~/bin/
) 에 넣습니다 gg
. git grep
지정된 파일 형식을 사용 하지만 피합니다.
우리 저장소에는 많은 이미지가 있으므로 이미지 파일을 제외했으며 전체 저장소를 검색하면 serchtime이 1/3로 줄어 듭니다. 그러나 다른 파일 형식이나 겔러 패턴을 제외하도록 스크립트를 쉽게 수정할 수 있습니다.
#!/bin/bash
#
# Wrapper of git-grep that excludes certain filetypes.
# NOTE: The filetypes to exclude is hardcoded for my specific needs.
#
# The basic setup of this script is from here:
# https://stackoverflow.com/a/14226610/42580
# But there is issues with giving extra path information to the script
# therefor I crafted the while-thing that moves path-parts to the other side
# of the '--'.
# Declare the filetypes to ignore here
EXCLUDES="png xcf jpg jpeg pdf ps"
# Rebuild the list of fileendings to a good regexp
EXCLUDES=`echo $EXCLUDES | sed -e 's/ /\\\|/g' -e 's/.*/\\\.\\\(\0\\\)/'`
# Store the stuff that is moved from the arguments.
moved=
# If git-grep returns this "fatal..." then move the last element of the
# arg-list to the list of files to search.
err="fatal: bad flag '--' used after filename"
while [ "$err" = "fatal: bad flag '--' used after filename" ]; do
{
err=$(git grep "$@" -- `git ls-files $moved | grep -iv "$EXCLUDES"` \
2>&1 1>&3-)
} 3>&1
# The rest of the code in this loop is here to move the last argument in
# the arglist to a separate list $moved. I had issues with whitespace in
# the search-string, so this is loosely based on:
# http://www.linuxjournal.com/content/bash-preserving-whitespace-using-set-and-eval
x=1
items=
for i in "$@"; do
if [ $x -lt $# ]; then
items="$items \"$i\""
else
moved="$i $moved"
fi
x=$(($x+1))
done
eval set -- $items
done
# Show the error if there was any
echo $err
참고 1
에 따르면 이 이 일을 이름을 할 수 있어야 git-gg
하고 같은 일반 자식 명령으로 호출 할 수 :
$ git gg searchstring
그러나 나는 이것을 작동시킬 수 없다. 내 스크립트를 만들고에서 심볼릭 링크를 ~/bin/
만들었 git-gg
습니다 /usr/lib/git-core/
.
노트 2
명령은 sh
repo의 루트에서 호출되므로 일반 git-alias 로 만들 수 없습니다 . 그리고 그것은 내가 원하는 것이 아닙니다!