source

원격 없이 모든 로컬 분기 나열

ittop 2023. 8. 30. 22:04
반응형

원격 없이 모든 로컬 분기 나열

例제:.리모컨이 없는 모든 로컬 지점을 삭제하는 방법을 원합니다.을 지의이쉽연게수결있다습니할가을름▁a▁▁to다▁it로 연결하는 것은 git branch -D {branch_name}하지만 애초에 어떻게 그 목록을 얻을 수 있을까요?

예:

원격 없이 새 분기를 만듭니다.

$ git co -b no_upstream

내 모든 지점을 나열하고 리모컨이 있는 지점은

$ git branch -a
master
* no_upstream
remotes/origin/HEAD -> origin/master
remotes/origin/master

어떤 명령을 실행하여 가져올 수 있습니까?no_upstream답으로?

달릴 수 있습니다git rev-parse --abbrev-ref --symbolic-full-name @{u}그러면 리모컨이 없다는 것을 알 수 있습니다.

$ git rev-parse --abbrev-ref --symbolic-full-name @{u}
error: No upstream configured for branch 'no_upstream'
error: No upstream configured for branch 'no_upstream'
fatal: ambiguous argument '@{u}': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

그러나 이것은 오류이기 때문에 사용하거나 다른 명령으로 연결할 수 없습니다.셸 의 별칭으로 사용하려고 .git-delete-unbranched아니면 아주 간단한 젬을 만들 수도 있습니다.git-branch-delete-orphans

를 사용하는 것이 좋습니다.git branch --format는원정출지정다니합력에서 합니다.git branch지권휘 하면할 수 이렇게 하면 다음과 같이 refname과 업스트림만 추출할 수 있습니다.

git branch --format "%(refname:short) %(upstream)"

분기가 있는 경우 원격 분기와 함께 다음 형식으로 출력됩니다.

25-timeout-error-with-many-targets
31-target-suggestions refs/remotes/origin/31-target-suggestions
54-feedback-link refs/remotes/origin/54-feedback-link
65-digest-double-publish

이와 같이 형식이 잘 지정된 출력을 사용하면 쉽게 처리할 수 있습니다.awk목록 가져오기:

git branch --format "%(refname:short) %(upstream)" | awk '{if (!$2) print $1;}'

결과는 다음과 같습니다.

25-timeout-error-with-many-targets
65-digest-double-publish

awk두 번째 열이 없는 경우 partion은 첫 번째 열을 인쇄합니다.

보너스: 별칭 만들기

에서 할 수 ..gitconfig파일(또는 어디서나):

[alias]
  local-branches = "!git branch --format '%(refname:short) %(upstream:short)' | awk '{if (!$2) print $1;}'"

보너스: 원격 필터링

어떤 이유로 서로 다른 분기에 대해 여러 개의 추적 리모컨이 있는 경우 확인할 원격을 쉽게 지정할 수 있습니다.원격 이름을 Awk 패턴에 추가하기만 하면 됩니다.저같은경우는에는경s'에▁in우▁it은.origin제가 할 수 있는 일은

git branch --format "%(refname:short) %(upstream)" | awk '$2 !~/\/origin\// { print $1 }'

중요:백슬래시를 별칭으로 이스케이프해야 합니다. 그렇지 않으면 잘못된 gitconfig 파일이 있습니다.


이전 답변

앞의 답은 기능적으로 비슷했지만, 다음을 출발점으로 사용했습니다.시간이 지남에 따라 커밋 메시지에서 발생할 수 있는 분산으로 인해 정규식을 신뢰할 수 없다는 지적이 제기되어 더 이상 이 방법을 권장하지 않습니다.하지만 여기 참고용으로 있습니다.

는 최근에 최에발것은한견을 발견했습니다.git branch -vv은 그은매 " 우장한 " 입황니 "의 장황한" 입니다.git branchcommand

분기가 있는 경우 원격 분기와 함께 다음 형식으로 출력됩니다.

  25-timeout-error-with-many-targets    206a5fa WIP: batch insert
  31-target-suggestions                 f5bdce6 [origin/31-target-suggestions] Create target suggestion for team and list on save
* 54-feedback-link                      b98e97c [origin/54-feedback-link] WIP: Feedback link in mail
  65-digest-double-publish              2de4150 WIP: publishing-state

이와 같이 형식이 잘 지정된 출력을 사용하면 쉽게 처리할 수 있습니다.cut그리고.awk목록 가져오기:

git branch -vv | cut -c 3- | awk '$3 !~/\[/ { print $1 }'

git branch (옵션 없이) 로컬 분기만 나열되지만 원격 분기를 추적하는지 여부는 알 수 없습니다.

은 일적으로분컬다병음합합후니다삭야제해된로로 병합되면 .main(이번 git-discovery 에서 볼 수 있듯이):

git branch --no-contains main --merged main| xargs git branch -d

2020/2021년 이후 대부분의 리포지토리는 대신 기본 분기로 사용합니다.

이것은 당신이 원하는 만큼 완전하지는 않지만, 시작입니다.

와 함께--merged명명된 커밋에 병합된 분기(즉, 명명된 커밋에서 팁 커밋에 도달할 수 있는 분기)만 나열됩니다.

저도 비슷한 문제가 있습니다.지금 삭제된 원격 지점을 추적하던 모든 로컬 지점을 제거하려고 합니다.나는 그것을 발견하고 있습니다.git remote prune origin내가 원하는 가지를 제거하기에는 충분하지 않았습니다.일단 리모콘이 삭제되면 로컬도 사라졌으면 좋겠습니다.다음은 저에게 도움이 되었습니다.

의 게서에서.~/.gitconfig:

[alias]
  prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -d

여기 있습니다.git config --global ...을 쉽게추할있명령어는으로 할 수 git prune-branches:

git config --global alias.prune-branches '!git remote prune origin && git branch -vv | grep '"'"': gone]'"'"' | awk '"'"'{print $1}'"'"' | xargs -r git branch -d'

참고: 변경했습니다.-d-D내 실제 구성에서, 나는 Git가 합병되지 않은 지점에 대해 불평하는 것을 듣고 싶지 않기 때문입니다.이 기능도 필요할 수 있습니다.만약 그렇다면, 간단히 사용-D-d그 명령의 끝에.

은 거의 "", "FWIW", ""입니다.~/.gitconfig.

(OS X 수정)

와 같이, X에서는 에된바와같, 이다같이작않다동이습니지하은유기술을 X에서는 .xargs -r(고마워요, 코니)

-r예방하기 위한 것입니다.xargsgit branch -d이름을 "지이없이으면름 " "라는 가 표시됩니다.fatal: branch name required오류 메시지가 문제가 되지 않는다면, 간단히 제거할 수 있습니다.-r에 대한 인수입니다.xargs준비가 다 되었습니다.

그러나 오류 메시지(그리고 누가 당신을 비난할 수 있는지)를 보고 싶지 않다면 빈 파이프를 확인하는 다른 것이 필요합니다.만약 당신이 더 많은 유틸리티에서 사용할 수 있다면.를 삽입할 수 있습니다.ifne 앞에xargs은 멈출것다니입▁stop다▁will▁which니것.xargs빈 데이터를 사용하여 실행합니다.참고:ifne에서는 빈 줄이 없는 것으로 간주하므로 오류 메시지가 계속 표시될 수 있습니다.저는 이것을 OS X에서 테스트하지 않았습니다.

여기 있습니다git config와 일치하는.ifne:

git config --global alias.prune-branches '!git remote prune origin && git branch -vv | grep '"'"': gone]'"'"' | awk '"'"'{print $1}'"'"' | ifne xargs git branch -d'

이것은 나에게 도움이 됩니다.

git branch -vv | grep -v origin

(원본 이외의 이름을 가진 리모컨의 경우 이를 대체합니다.)

여기에는 리모컨을 추적하지 않는 모든 분기가 나열되며, 이는 원하는 것처럼 들립니다.

늦은 편집:

더 좋은 것은

git for-each-ref  --format='%(refname:short) %(upstream)'  refs/heads \
| awk '$2 !~/^refs\/remotes/'

GNU/anything에서

for b in `git branch|sed s,..,,`; do
    git config --get branch.$b.remote|sed Q1 && echo git branch -D $b
done

만약 소수 이상의 지점이 있을 가능성이 있다면, 더 나은 방법이 있을 것입니다.comm -23로의 으로.git branch|sed|sort그리고.git config -l|sed|sort.

는 내나 ▁the▁to▁get다얻니▁g▁own습▁iit▁synthe나▁myt는을 얻기 위해 저만의 Git 명령어를 합성합니다.origin/***: gone분기:

git remote prune origin && git branch -vv | cut -c 3- | grep ': gone]' | awk '{print $1}' | xargs -n1 -r echo git branch -d

git remote prune origin && git branch -vv자세한 모드로 분기를 인쇄합니다.

cut -c 3-첫 번째 문자를 제거합니다.

grep ': gone]'사라진 원격 분기만 인쇄합니다.

awk '{print $1}'지점 이름을 인쇄합니다.

xargs -n1 -r echo git branch -d을 합니다.git branch -d분기를 제거하는 명령(-n1은 한 번에 하나의 명령을 관리하고, -r은 분기가 없는 경우 명령을 실행하지 않도록 합니다.)

힌트: "echo" 명령을 제거하여 인쇄만 하는 대신 명령을 실행합니다. git를 실행하기 전에 명령을 확인하기 위해 명령에 이 명령을 남겨두었습니다.

힌트 2: 문제git branch -D되지 않은 분기를 됩니다.

다음은 PowerShell의 기능을 설명하기 위해 설명과 함께 PowerShell에서 사용한 내용입니다.무슨 일이 일어나고 있는지 분명히 하기 위해 PowerShell 명령(에일리어스)을 줄여서 사용하지 않았습니다.원하는 암호화 수준까지 자유롭게 압축하세요 :)

$verboseList = @(git branch -vv)
foreach ($line in $verboseList)
{
    # Get the branch name
    $branch = [regex]::Match($line, "\s(\S+)\s").Captures.Groups[1].Value
    # Check if the line contains text to indicate if the remote is deleted
    $remoteGone = $line.Contains(": gone]")
    # Check if the line does not contain text to indicate it is a tracking branch (i.e., it's local)
    $isLocal = !($line.Contains("[origin/"))
    if ($remoteGone -or $isLocal)
    {
        # Print the branch name
        $branch
    }
}

여기서 가장 많이 투표된 답변은 내 시스템에서 작동하지 않습니다.

다음은 효과가 있고 상당히 깨끗합니다.

git branch -v | awk '$3 == "[gone]" { print $1 }' | xargs git branch -D

병합되지 않은 분기를 삭제하지 않으려면 -d를 사용합니다.

기존의 답변 중 저에게는 효과가 없는 것 같습니다.

원격이 아닌 로컬 지점을 나열하는 솔루션은 다음과 같습니다.

comm -13 <(git branch -r | sed 's/origin\/\(.*\)/\1/g' | cut -c 3-) <(git branch | cut -c 3-)

작동 방식에 대한 설명은 다음과 같습니다.

  1. 지점 또는 공백 의 목록을 합니다.git branch -r | sed 's/origin\/\(.*\)/\1/g' | cut -c 3-

  2. 분기공백 없음)의 합니다.git branch | cut -c 3-

  3. 두하고 목록 2 지점 목록 1지점 합니다. 이 을 비 하 에 내 여 교 2 (목 록 로 분 에 컬 기 분 원 목 기 1 (록 격 니 다 합 표 시 항 을 목 없 는 목 록 중 목 항 는 두 록 목 있 ▁compare ▁in ▁me 에 the ) ( ) my ▁branches ▁( ▁lists ▁local ▁anything ▁2 ▁branches ▁showcomm -13 <(git branch -r | sed 's/origin\/\(.*\)/\1/g' | cut -c 3-) <(git branch | cut -c 3-)

comm은 줄을 표시하지 않을 파일을 나타내는 플래그 -1, -2 및 -3의 조합을 취할 수 있습니다(파일 1에 포함, 파일 2에 고유 또는 둘 모두에 공통).

사용할 수 있습니다.%(upstream:track) 형식 지정:

git branch --format "%(refname:short) %(upstream:track)" |
  awk '{if($2=="[gone]") print $1;}'

git branch -v구문 분석에 신뢰할 수 없습니다.

Git 버전 2.37.1

기존 답변 중 몇 가지를 결합합니다.

[alias]
        branch-local = !git branch -vv | cut -c 3- | egrep '([0-9a-f]{7} [^[])|(: gone\\])' | sed -E 's/(^.+[0-9a-f]{7} (\\[.+\\])?).*$/\\1/'

예:

$ git branch-local
autogen_autoreconf      fcfb1c6 [github/autogen_autoreconf: gone]
autotools_documentation 72dc477 [github/autotools_documentation: gone]
cray-mpich-messy        2196f4b
epel-sphinx             cfda770
lammps                  07d96a7 [github/lammps: gone]
lark-error              9ab5d6c [github/lark-error: gone]
no-root2                c3894d1
openmpi-cray            69326cf [github/openmpi-cray: gone]
shellcheck-cleanup      40d90ec
travis-python36         cde072e
update_vagrant_default  4f69f47 [github/update_vagrant_default: gone]
web-docs                e73b4a8

언급URL : https://stackoverflow.com/questions/15661853/list-all-local-branches-without-a-remote

반응형