Git을 사용하여 모든 분기에서 문자열을 어떻게 검색 할 수 있습니까?


170

Git을 사용하여 모든 로컬 지점의 모든 파일에서 주어진 문자열을 어떻게 검색 할 수 있습니까?

GitHub 관련 : 모든 GitHub 브랜치에서 위의 검색을 수행 할 수 있습니까? (원격 GitHub 저장소에는 여러 가지 원격 브랜치가있어 이상적 으로이 검색을 중단 할 필요가 없습니다 ...)


1
git-grep 은 당신이 찾고있는 것이지만, 어떤 옵션이 필요한지 잘 모르겠습니다 ...
johnny

답변:


170

Git 저장소에서이를 수행 할 수 있습니다.

git grep "string/regexp" $(git rev-list --all)

GitHub 고급 검색에는 코드 검색 기능이 있습니다.

코드 검색은 GitHub에 공개적으로 호스팅 된 모든 코드를 살펴 봅니다. 다음을 기준으로 필터링 할 수도 있습니다.

  • 언어: language:
  • 저장소 이름 (사용자 이름 포함) : repo:
  • 파일 경로 : path:

이로 인해 분할 오류가 발생합니다. 그래도 거북이 거북이 병합 (Windows) 일 수 있습니다.
bean5

6
이것은 실제로 가장 좋은 방법은 아닙니다. 전달되는 자식 참조의 양을 제어하지 않습니다 git grep .... 다른 답변을 살펴보십시오.이 답변은 허용 된 답변으로 표시되어 있지만이 답변보다 훨씬 좋습니다!
slm

1
예를 들어 path:, 필터 예제를 추가 할 수 있다면 좋을 것입니다 . 문서를 한눈에 살펴보면 쿼리 예제에서 따옴표 앞에 있다고 가정하여이 필터를 적용 할 위치를 명확하게 알 수 없습니까?
blamb

3
지점 이름 만 나열하려면 어떻게해야합니까? 현재 모든 해시에 문자열이 포함되어 있습니다.
harryfeng

4
Github 검색은 마스터 브랜치 에서만 가능 합니다. 에서 help.github.com/articles/searching-code : "오직 기본 분기 코드 검색 인덱싱 대부분의 경우,이 마스터 지점 일 것이다.."
RedPanda

124

@manojlds Git grep 명령을 사용하고 오류가 발생하는 경우 :

-bash: /usr/bin/git: Argument list too long" 

그런 다음 xargs 를 사용해야합니다 .

git rev-list --all | xargs git grep "string/regexp"

Git 히스토리에서 커밋 된 코드를 grep (검색)하는 방법 도 참조하십시오.


또한 이것은 피쉬 쉘과 같은 다른 종류의 콘솔과 더 호환되는 것 같습니다
Daniel

1
감사!!! ZSH를 사용하면 @manojlds 명령에서 언급 한 오류가 발생했습니다! 그러나 경고, 오랜 역사를 가진 대규모 레포의 경우 시간이 오래 걸릴 수 있습니다.
lacostenycoder

54

많은 경우에 git rev-list --all, 많은 수의 커밋을 반환하여 영원히 스캔 할 수 있습니다. 저장소 히스토리의 모든 브랜치에서 모든 커밋을 검색하는 대신 모든 브랜치 팁을 검색하려는 경우이를로 바꿀 수 있습니다 git show-ref --heads. 따라서 총계 :

git grep "string" `git show-ref --heads`

또는:

git show-ref --heads | xargs git grep "string"

팁 : 파일로 출력을 작성하여 편집기에서 볼 수 있습니다.

nano ~/history.txt
git show-ref --heads | xargs git grep "search string here" >> ~/history.txt

6
git show-ref --heads해시와 참조 이름을 나열하므로 두 번째 줄은 두 번 검색합니다. git show-ref --heads | cut -d' ' -f2참조 이름 만 나열 하므로 더 좋습니다.
hiPy

4
이 질문은 질문과 대답 된 횟수를 믿을 수 없다, 그러나 당신이 가진 유일한 사람이야 올바른 답을.
Sammitch

1
git show-ref --heads -sSHA1 해시 만 출력합니다. 또한 동일한 커밋을 가리키는 여러 분기가 있으면 중복됩니다. 다음과 sort -u같이 제거 할 수 있습니다.git show-ref --heads -s | sort -u | xargs git grep ...
Steve

bashrc에 추가 한 기능은 다음과 같습니다. 누군가에게 도움이 function gsearch { git grep $1 $(git show-ref --heads) | grep "refs/heads" | grep $1 } # last grep to keep grep color highlight
되기를 바랍니다

이것이 정답입니다. 모든 브랜치에서 문자열을 잡는 것이지만 최신 콘텐츠에만 매우 일반적인 사용 사례입니다.
dr_

21

여기에 나열된 솔루션에는 몇 가지 문제가 있습니다 (심지어 받아 들여짐).

중복을 얻을 수 있으므로 모든 해시를 나열 할 필요는 없습니다. 또한 시간이 더 걸립니다.

당신이 문자열을 검색 할 수 있습니다 곳이 기반으로 "test -f /"여러 가지에 masterdev등을

git grep "test -f /" master dev

어느

printf "master\ndev" | xargs git grep "test -f /"

여기로갑니다.

이것은 모든 로컬 브랜치의 팁에 대한 해시를 찾고 해당 커밋에서만 검색합니다.

git branch -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"

원격 지점에서도 검색 해야하는 경우 다음을 추가하십시오 -a.

git branch -a -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"

더욱이:

# Search in local branches
git branch | cut -c3- | xargs git grep "string"

# Search in remote branches
git branch -r | cut -c3- | xargs git grep "string"

# Search in all (local and remote) branches
git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string"

# Search in branches, and tags
git show-ref | grep -v "refs/stash" | cut -d' ' -f2 | xargs git grep "string"

5
적어도 모든 지점에서 검색해야합니다 위해 : git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string" 아니면 실패합니다 ->원격 지사 관계 로컬 의미 파일 목록에서 기호
일리아 Sheershoff

7

당신은 이것을 시도 할 수 있습니다 :

git log -Sxxxx  # Search all commits
git log -Sxxxx  --branches[=<pattern>]   # Search branches

1
모든 지점에서 :git log --all -s"search_string"
Tim Kuipers
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.