programing

Git 프로젝트의 모든 분기에서 'grep 검색'을 수행할 수 있습니까?

muds 2023. 7. 15. 10:39
반응형

Git 프로젝트의 모든 분기에서 'grep 검색'을 수행할 수 있습니까?

실행이 가능합니까?git grepGit 컨트롤 소싱 프로젝트의 모든 분기 안에 있습니까?아니면 실행할 다른 명령이 있습니까?

"Git 내역에서 커밋된 코드를 grep(검색)하는 방법" 질문은 다음을 권장합니다.

 git grep <regexp> $(git rev-list --all)

모든 분기를 포함하는 모든 커밋을 검색합니다.

또 다른 형태는 다음과 같습니다.

git rev-list --all | (
    while read revision; do
        git grep -F 'yourWord' $revision
    done
)

이 기사에서 더 많은 예를 찾을 수 있습니다.

저는 인수 크기에 대해 불평할 정도로 충분히 큰 프로젝트에서 위의 내용을 시도했습니다. 따라서 이 문제에 부딪히면 다음과 같은 작업을 수행하십시오.

git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done)

(아래 이 답변의 마지막 섹션에 있는 대안을 참조하십시오.)

원하는 경우 다음 설정을 잊지 마십시오.

# Allow Extended Regular Expressions
git config --global grep.extendedRegexp true
# Always Include Line Numbers
git config --global grep.lineNumber true

이 별칭을 사용하면 다음과 같은 이점이 있습니다.

git config --global alias.g "grep --break --heading --line-number"

2016년 8월 업데이트: R.M.이 댓글로 추천합니다.

나는 "fatal: bad flag '->' used after filename을 시도할 때git branch판본오류가 다음과 관련되어 있습니다.HEAD앨리어싱 표기법

나는 그것을 a를 추가하여 해결했습니다.sed '/->/d'파이프 안에서, 사이에.tr그리고xargs명령을 실행합니다.

git branch -a | tr -d \* | sed '/->/d' | xargs git grep <regexp>

즉, 다음과 같습니다.

alias grep_all="git branch -a | tr -d \* | sed '/->/d' | xargs git grep"
grep_all <regexp>

이것은 Chernjie제안한 해결책보다 개선된 것입니다.git rev-list --all과잉 살상입니다.

보다 세분화된 명령은 다음과 같습니다.

# Don't use this, see above
git branch -a | tr -d \* | xargs git grep <regexp>

이렇게 하면 원격 분기를 포함하여 분기만 검색할 수 있습니다.

bash/zsh 별칭을 생성할 수도 있습니다.

# Don't use this, see above  
alias grep_all="git branch -a | tr -d \* | xargs git grep"
grep_all <regexp>

git log특히 일치하는 항목이 많은 경우에는 모든 분기에서 텍스트를 보다 효과적으로 검색할 수 있으며, 가장 최근에 변경된 내용을 먼저 보려는 경우에는 더욱 유용합니다.

git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'

이러한 로그 명령은 지정된 검색 문자열/레거시(일반적으로)를 추가하거나 제거하는 커밋을 먼저 나열합니다.-p옵션을 사용하면 패턴이 추가되거나 제거된 위치에 관련 diff가 표시되므로 컨텍스트에서 패턴을 확인할 수 있습니다.

원하는 텍스트를 추가하는 관련 커밋(예: 8beff00d)을 찾았으면 커밋이 포함된 분기를 찾습니다.

git branch -a --contains 8beeff00d

저는 이것이 가장 유용하다고 생각했습니다.

git grep -i foo `git for-each-ref --format='%(refname)' refs/`

원격 분기와 로컬 분기 중 어느 쪽만 볼 것인지에 따라 마지막 인수를 조정해야 합니다.

  • git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes)
  • git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)

내가 만든 별칭은 다음과 같습니다.

grep-refs = !sh -c 'git grep "$0" "$@" "$(git for-each-ref --format=\"%(refname)\"" refs/)'

두 가지 일반적인 방법으로 이 작업을 수행할 수 있습니다.Bash 또는 Git 별칭

다음 세 가지 명령이 있습니다.

  1. git grep-branch로컬 및 원격의 모든 분기에서 검색
  2. git grep-branch-local로컬 분기에서만 검색
  3. git grep-branch-remote만 해당됨

사용법은 다음과 같습니다.

git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"

GEP 사용:깃 별칭

파일 ~/.gitconfig

으로 명을수야합니에 .~/.gitconfig 파일, 유이git config --global alias사용자가 추가한 복잡한 코드를 평가하여 엉망으로 만듭니다.


[alias]
    grep-branch        = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | xargs git grep $@; };f "
    grep-branch-remote = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | grep '^remotes' | xargs git grep $@; };f"
    grep-branch-local  = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' -e '^remotes' | xargs git grep $@;  };f "

참고: 별칭을 추가했지만 실행에 실패한 경우 - 백슬래시 확인\은 추가 할 수도 .\\bash 명령과 비교해 볼 수 있습니다.

  • git branch -a분기를 합니다.
  • sed -e 's/[ \\*]*//'공간 자르기(부터)branch -a *(으)로 표시됨;
  • grep -v -e '\\->' 같은 복잡한 합니다.remotes/origin/HEAD -> origin/master;
  • grep '^remotes'분기를 .
  • grep -v -e '^remotes'원격 분기를 제외한 분기 가져오기;

»git grep-branch-local -n getTastyCookies

-n일치하는 줄 앞에 줄 번호를 붙입니다.

[user@pc project]$ git grep-branch-local -n getTastyCookies

dev:53:modules/factory/getters.php:function getTastyCookies($user);
master:50:modules/factory/getters.php:function getTastyCookies($user)

현재 구조는 다음과 같습니다.

: 기호

  1. 지점:dev
  2. 번호: 라인번호:53
  3. 경로: 파일경:modules/factory/getters.php
  4. 라인: 일하는선치:function getTastyCookies($user)

GEP 사용: BASH

는 Bash 명은저장합니다야해에 .sh스크립트 또는 셸에서 실행합니다.

로컬 분기만

git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' -e '^remotes' | xargs git grep "TEXT"

원격 분기만

git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | grep '^remotes' | xargs git grep "TEXT"

로컬 및 원격 지점

git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | xargs git grep "TEXT"

방법은 다음과 같습니다.

git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM

을 SHA-1에 git grep작업 복사본 대신 검색이 있습니다.

모든 분기를 검색하려면 다음과 같은 모든 트리를 얻을 수 있습니다.git rev-list --all다 집어치워요

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

인내심을 가지세요.

언급URL : https://stackoverflow.com/questions/15292391/is-it-possible-to-perform-a-grep-search-in-all-the-branches-of-a-git-project

반응형