development

Git 브랜치를 검색하여 파일이나 디렉토리를 찾으려면 어떻게해야합니까?

big-blog 2020. 3. 14. 10:17
반응형

Git 브랜치를 검색하여 파일이나 디렉토리를 찾으려면 어떻게해야합니까?


Git에서 여러 브랜치에서 경로로 파일 또는 디렉토리를 어떻게 검색 할 수 있습니까?

지점에 무언가를 썼는데 어느 것을 기억하지 못합니다. 이제 찾아야합니다.

설명 : 나는 내 지점 중 하나에서 만든 파일을 찾고 있습니다. 내용이 무엇인지 기억하지 못하기 때문에 내용이 아닌 경로별로 찾고 싶습니다.


git log+ git branch당신을 위해 그것을 찾을 것입니다 :

% git log --all -- somefile

commit 55d2069a092e07c56a6b4d321509ba7620664c63
Author: Dustin Sallings <dustin@spy.net>
Date:   Tue Dec 16 14:16:22 2008 -0800

    added somefile


% git branch -a --contains 55d2069
  otherbranch

globbing도 지원합니다 :

% git log --all -- '**/my_file.png'

작은 따옴표는 (적어도 Bash 쉘을 사용하는 경우) 필요하므로 쉘은 글로브 패턴을 변경하지 않고 git에 전달합니다 (Unix와 마찬가지로 find).


git ls-tree가 도움이 될 수 있습니다. 기존의 모든 지점을 검색하려면

for branch in `git for-each-ref --format="%(refname)" refs/heads`; do
  echo $branch :; git ls-tree -r --name-only $branch | grep '<foo>'
done

이것의 장점은 파일 이름을 정규식으로 검색 할 수도 있다는 것입니다.


ididak의 응답 은 꽤 멋지 지만 Handyman5 는 그것을 사용하는 스크립트를 제공하지만 그 접근 방식을 사용하는 것이 약간 제한적이라는 것을 알았습니다.

때때로 시간이 지남에 따라 표시되거나 사라질 수있는 것을 검색해야하므로 모든 커밋에 대해 검색하지 않는 이유는 무엇입니까? 그 외에도 때로는 자세한 응답이 필요하고 다른 경우에는 일치하는 커밋 만 있습니다. 해당 옵션의 두 가지 버전이 있습니다. 다음 스크립트를 경로에 넣으십시오.

자식 찾기 파일

for branch in $(git rev-list --all)
do
  if (git ls-tree -r --name-only $branch | grep --quiet "$1")
  then
     echo $branch
  fi
done

자식 찾기 파일 상세

for branch in $(git rev-list --all)
do
  git ls-tree -r --name-only $branch | grep "$1" | sed 's/^/'$branch': /'
done

이제 할 수 있습니다

$ git find-file <regex>
sha1
sha2

$ git find-file-verbose <regex>
sha1: path/to/<regex>/searched
sha1: path/to/another/<regex>/in/same/sha
sha2: path/to/other/<regex>/in/other/sha

getopt 를 사용 하면 모든 커밋, 참조, 참조 / 헤드, 상세 정보 등을 번갈아 검색하도록 해당 스크립트를 수정할 수 있습니다.

$ git find-file <regex>
$ git find-file --verbose <regex>
$ git find-file --verbose --decorated --color <regex>

체크 아웃 https://github.com/albfan/git-find-file 가능한 구현합니다.


gitk --all커밋 "터치 경로"와 관심있는 경로 이름을 사용 하고 검색 할 수 있습니다 .


사용하려면 복사하여 붙여 넣기 git find-file SEARCHPATTERN

검색된 모든 분기 인쇄 :

git config --global alias.find-file '!for branch in `git for-each-ref --format="%(refname)" refs/heads`; do echo "${branch}:"; git ls-tree -r --name-only $branch | nl -bn -w3 | grep "$1"; done; :'

결과가있는 가지만 인쇄하십시오.

git config --global alias.find-file '!for branch in $(git for-each-ref --format="%(refname)" refs/heads); do if git ls-tree -r --name-only $branch | grep "$1" > /dev/null; then  echo "${branch}:"; git ls-tree -r --name-only $branch | nl -bn -w3 | grep "$1"; fi; done; :'

이 명령은 최소한의 쉘 스크립트 ~/.gitconfig전역 git 별명 으로 직접 추가합니다 .


findGit 리포지토리 에 대한 명령 구현은 다음 과 같습니다.

https://github.com/mirabilos/git-find

참고 URL : https://stackoverflow.com/questions/372506/how-can-i-search-git-branches-for-a-file-or-directory

반응형