programing

Git를 사용하여 모든 분기에서 문자열을 검색하려면 어떻게 해야 합니까?

abcjava 2023. 5. 6. 14:00
반응형

Git를 사용하여 모든 분기에서 문자열을 검색하려면 어떻게 해야 합니까?

Git를 사용하여 모든 로컬 분기의 모든 파일에서 지정된 문자열을 검색하려면 어떻게 해야 합니까?

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

Git 저장소에서 이 작업을 수행할 수 있습니다.

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

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

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

  • 언어: language:
  • 리포지토리 이름(사용자 이름 포함): repo:
  • 파일 경로:path:

@manojlds Gitgrep 명령을 사용하는 경우 오류가 표시됩니다.

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

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

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

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

많은 경우git rev-list --all검색하는 데 시간이 오래 걸려 엄청난 수의 커밋을 반환할 수 있습니다.저장소 기록의 모든 분기에 대한 모든 커밋을 검색하는 대신 모든 분기 팁을 검색하려는 경우 다음으로 대체할 수 있습니다.git show-ref -s --heads그래서 총합:

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

또는:

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

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

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

여기 나열된 솔루션에는 몇 가지 문제가 있습니다(승인된 솔루션도 있음).

중복되므로 모든 해시를 나열할 필요는 없습니다.또한, 그것은 더 많은 시간이 걸립니다.

이것을 기반으로 문자열을 검색할 수 있습니다."test -f /"여러 갈래로master그리고.dev~하듯이

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"

사용해 볼 수 있습니다.

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

@peter-mortensen & manojlds의 솔루션에 따라, 저는git for-each-ref하위 명령으로 이름을 가진 분기만 나열합니다.

git grep "string/regexp" $(git for-each-ref --format='%(refname:short)' refs/heads)

이렇게 하면 명명된 분지만 표시하고 각 분기에 대해 하나의 결과만 생성하여 시각화를 개선할 수 있습니다.

분기 이름을 검색 결과와 함께 표시하려면 루프를 사용하여 다음과 같이 각 분기를 개별적으로 검색할 수 있습니다.

bash 코드

for branch in $(git branch | awk '{print $1}'); do
    echo "Branch: $branch"
    git grep "SEARCH_WORD" $(git rev-parse $branch)
done

이 루프는 git branch를 사용하여 모든 분기를 나열하고 awk를 사용하여 분기 이름만 추출합니다.그런 다음 git rev-parse를 사용하여 각 분기의 커밋 해시를 가져오고 git grep을 사용하여 해당 분기에서 "deleteTemplateDocument" 문자열을 검색합니다.출력에 분기 이름과 각 분기에 대한 일치 결과가 표시됩니다.

git log -S <search string> --source --all

https://stackoverflow.com/a/5816177/5368856

커밋을 되돌립니다. 커밋 ID가 HEAD에 없을 수 있습니다.

git revert commit_id

대/소문자 사용을 무시하는 방법 -i:

git log -i --all --grep='word1 Word2'

언급URL : https://stackoverflow.com/questions/7151311/using-git-how-could-i-search-for-a-string-across-all-branches

반응형