programing

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

nicescript 2023. 5. 22. 23:19
반응형

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

글로빙도 지원합니다.

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

단일 따옴표는 필요합니다(최소한 Bash 셸을 사용하는 경우). 따라서 셸은 글로벌 패턴을 확장하는 대신 git에 변경되지 않고 전달합니다(UNIX와 마찬가지로).find).

gits-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

이 기능의 장점은 파일 이름에 대한 정규식으로 검색할 수 있다는 것입니다.

idididak의 반응은 꽤 멋지고 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를 사용하면 스크립트를 수정하여 모든 커밋, refs, refs/heads, be verbose 등을 번갈아 검색할 수 있습니다.

$ 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커밋 "커밋 경로"와 관심 있는 경로 이름을 검색합니다.

UI

UI 필드

(크레딧: @MikeW의 제안)

사용할 복사 및 붙여넣기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 log --source --all --diff-filter=A --name-only -- '**/my_file.png'

꽤 괜찮은 구현입니다.findGit 저장소에 대한 명령은 다음에서 확인할 수 있습니다.

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

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

반응형