더 이상 원격에 존재하지 않는 로컬 추적 분기를 제거하는 방법


768

git remote prune origin나는 더 이상 원격에없는 로컬 가지를 제거 할 수 있습니다.

그러나 또한 원격 지점에서 생성 된 로컬 지점을 제거하고 싶습니다 (병합되지 않은지 확인하는 것이 좋습니다).

어떻게해야합니까?



1
하나의 라이너, 크로스 플랫폼은 고양이가 키보드에서자는 것처럼 보이지 않습니다 npx git-removed-branches(건조) 또는 npx git-removed-branches --prune(실제). node.js 가 이미 설치되어 있어야합니다. 자세한 내용 아래 답변을 참조 하십시오.
Cristian Diaconescu

답변:


891

가지 치기 후을 사용하여 원격 분기 목록을 얻을 수 있습니다 git branch -r. 원격 추적 분기가있는 분기 목록은을 사용하여 검색 할 수 있습니다 git branch -vv. 따라서이 두 목록을 사용하면 원격 목록에없는 원격 추적 분기를 찾을 수 있습니다.

이 줄은 트릭을 수행해야합니다 ( bash또는 zsh표준 Bourne 쉘에서는 작동하지 않습니다).

git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d

이 문자열은 원격 브랜치 목록을 가져 와서 egrep표준 입력 을 통해 전달합니다 . 그리고 원격 추적 분기가있는 분기를 사용 git branch -vv하고 (가있는 분기를 사용 및 필터링 origin) 분기 출력이 될 출력의 첫 번째 열을 가져옵니다. 마지막으로 모든 분기 이름을 분기 삭제 명령으로 전달하십시오.

-d옵션을 사용 하므로이 명령을 실행할 때 사용중인 지점으로 병합되지 않은 지점은 삭제되지 않습니다.

또한 git fetch --prune 먼저 실행해야합니다 . 그렇지 않으면 git branch -r원격 분기가 계속 표시됩니다.


12
이것은 나를 위해 완벽하게 작동했습니다. 어떻게 든 git fetch -p항상 충분하지는 않습니까?
Stefan Hendriks

16
불행히도 이것은 Windows의 Git Bash에서 작동하지 않습니다. sh.exe": cannot make pipe for process substitution: Function not implemented sh.exe": egrep -v -f /dev/fd/0: No such file or directory fatal: branch name required 어떤 아이디어?
Ludder

37
별명으로 추가하려면 :alias git-remove-untracked='git fetch --prune && git branch -r | awk "{print \$1}" | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk "{print \$1}" | xargs git branch -d'
bryant1410

125
이 작업을 수행 할 향후 git 릴리스에 대해 제안 된 명령이 있습니까? 이 명령은 내 고양이가 내 노트북에있는 것처럼 보입니다
Bron Davies

5
사용 git branch -D명령의 끝에서 우리가 우리에게 얻을 수있는 병합에 스쿼시 커밋하는 경향이, 우리를 위해 더 좋은 일을 The branch x is not fully merged함께 실행할 때 오류를 -d.
Mateus Gondim

430

이미 마스터로 병합 된 모든 로컬 브랜치를 삭제하려는 경우 다음 명령을 사용할 수 있습니다.

git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d

더 많은 정보 .


4
완벽하게 작동했다고 생각합니다! 이 답변이 허용되는 답변과 다르게 작동하는지 설명 할 수 있습니까?
Andrew

11
사소한 개선 : xargs -r git branch -d삭제할 분기가없는 경우 아무 것도 실행되지 않도록 사용하십시오. 점을 유의 -r플래그가 모든 곳에서 사용할 수 없습니다
야곱 왕에게

8
자식 색상으로 인해 grep이 일치하지 않을 수 있습니다.git branch --merged master --no-color | grep -v '^* master$' | xargs -n1 -r git branch -d
Mike D

5
@NickRes는 당신이 멋지게 요청한 것처럼 git branch --merged master마스터에 병합 된 분기를 나열 한 다음 중간 grep 부분은 마스터 자체를 제외하고 (마스터를 삭제하고 싶지 않습니다!) 마지막 xargs 부분은 git branch -d각각에서 분기를 삭제합니다 (분기 삭제) 결과. 또는 당신은 대답에 제공된 추가 정보 링크를 읽을 수 있습니다;)
jackocnr

14
개선 : git branch --merged master | egrep -v '^\s*\*?\s*master$' | xargs git branch -d. 마스터가 체크 아웃되면 git v2.10.1의 출력에 "* master"가 표시됩니다. 별표가 있거나없는 마스터를 제거합니다.
Esteban

162

에서 제공하는 정보 git help fetch중에는 다음과 같은 작은 항목이 있습니다.

 -p, --prune
        After fetching, remove any remote-tracking branches which no longer exist on the remote.

아마 git fetch -p 당신이 찾고있는 것입니까?

편집 : 좋아, 사실 3 년이 지난 후에도 여전히이 답변에 대해 토론하는 사람들을 위해이 답변을 제시 한 이유에 대한 약간의 정보가 있습니다 ...

먼저 OP는 "원격에 더 이상 있지 않은 원격 지점에서 생성 된 로컬 지점도 제거합니다"라고 말합니다. 이것은 분명하게 가능하지 않습니다git . 다음은 예입니다.

하자 내가 중앙 서버에 REPO가 있다고, 그것은라는 두 가지를 가지고 AB. 내 로컬 시스템에 그 REPO를 복제, 내 복제는 지역 심판 (실제적인 지점 아직)라는 것 origin/A등을 origin/B. 이제 내가 다음을 수행한다고 가정 해 봅시다.

git checkout -b A origin/A
git checkout -b Z origin/B
git checkout -b C <some hash>

여기서 중요한 사실은 어떤 이유로 든 로컬 리포지토리에서 원래 이름과 다른 이름을 가진 브랜치를 생성하기로 선택했으며, 원래 리포지토리에 아직 (아직) 존재하지 않는 로컬 브랜치를 가지고 있다는 것입니다.

이제하자 내가 모두 제거 말 AB원격 REPO에 지점을하고 (내 지역의 repo 업데이트 git fetch내 로컬 심판을 야기 어떤 형태의)을 origin/A하고 origin/B사라. 자, 내 지역의 repo는 세 가지 아직,이 A, Z등을 C. 이들 중 어느 것도 원격 저장소에 해당 분기가 없습니다. 그 중 두 가지는 "원격 지사에서 만들어졌습니다". 그러나 B원산지에 전화 한 지사가 있다는 것을 알고 있어도 알 수있는 방법이 없습니다.Z 에서 생성을B프로세스에서 이름이 바뀌었기 때문일 수 있습니다. 따라서 실제로 외부 프로세스 기록 분기 출처 메타 데이터 또는 기록을 알고있는 사람이 없으면 세 가지 분기 중 OP가 제거 대상이되는 것을 알 수 없습니다. git자동으로 유지 관리되지 않는 외부 정보가 없으면git fetch -p 가능한 한 가깝고 OP가 요청한 것을 문자 그대로 시도하는 자동 방법은 너무 많은 분기를 삭제하거나 OP가 그렇지 않은 일부를 놓칠 위험이 있습니다. 삭제하고 싶다.

다른 시나리오도 있습니다. 예를 들어, 세 가지 별도의 분기를 만들어서 origin/A서로 다른 세 가지 접근 방식을 테스트 한 다음 origin/A사라지는 것과 같습니다 . 이제 세 가지 분기가 있는데 이름이 모두 일치하지는 않지만에서 생성 origin/A되었으므로 OPs 질문을 문자 그대로 해석하려면 세 가지를 모두 제거해야합니다. 그러나 신뢰할 수있는 방법을 찾을 수 있다면 바람직하지 않을 수 있습니다 ...


107
로컬 브랜치를 삭제하지 않고 브랜치에 대한 원격 포인터 만
Jaap

4
원격에 존재하지 않는 로컬 분기 만 삭제하며 체크 아웃하지 않았습니다.
Jarek Jakubowski

15
Jaap 메모에 따라 질문을 더주의해서 읽어야합니다. 이 답변에 투표하는 사람들은 또한 질문이 실제로 무엇인지 읽어야합니다.
Søren Boisen

4
예, 이것은 실제로 내가하고 싶었던 것입니다! @ SørenBoisen 지난 2 년 동안 귀하의 의견을 다시 검토 할 시간이 있었기를 바랍니다. SO에 게시 된 콘텐츠가 항상 실제로 혼란스러워하는 OP의 요청과 만 관련이있는 경우 많은 정보를 제거 할 수 있습니다. 공식 지침 이외의 다른 사람에게이 사이트를 사용하는 방법을 알려주지 말고 직교하면서도 유용한 답변을 명확하게 방지하지는 마십시오.
Félix Gagnon-Grenier

6
@ FélixGagnon-Grenier이 답변에 대한 내 문제는 다음과 같습니다. 1) 질문이 분명하고 OP가 명확하게 혼동되지 않습니다. 2)이 답변은 질문에 대한 답변이 아니라고 언급하지 않습니다! 3) 질문에는 이미 더 이상 존재하지 않는 원격 추적 분기를 제거하는 방법이 나와 있으므로 0을 추가합니다.
Søren Boisen 2016 년

117

이렇게하면 원격 추적 분기가 정리 된 로컬 분기가 삭제됩니다. ( master지점 에 있는지 확인하십시오 !)

git checkout master
git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -d

세부:

  • git branch -vv 리모트가 제거 된 로컬 브랜치에 대해 "gone"을 표시합니다.

    mybranch abc1234 [origin/mybranch: gone] commit comments
    
  • -d병합되었는지 확인합니다 ( -D관계없이 삭제합니다)

    error: The branch 'mybranch' is not fully merged.
    

15
당신은을 사용하여 명령을 짧게 만들 수 있습니다git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
chiborg

4
git branch -d분기를와 비교 하기 때문에이 작업을 수행하기 전에 마스터해야한다고 지적하십시오 HEAD.
Steve Bennett

우수한! 나는 이것을보고 찾았다. 나는 혼자서 그것을 알아 내기 전에 당신의 대답을 보았기를 바랍니다. 몇 분만 절약했을 것입니다. 내 대답은 다음과 같습니다. stackoverflow.com/questions/15661853/…
Karl Wilbur

1
나는 비슷한 git alias로 끝났고 어떤 이유로 awk가 작동하지 않았기 때문에 cut을 사용했다.prunelocal = !sh -c \"git checkout -q master && git fetch -q --prune && git branch -vv | git grep ': gone]' | cut -d' ' -f3 | xargs git branch -d\"
Zitrax

3
오 친구 .. 당신이 위스 버키를해야 사람들에게 그들이 마스터해야한다고 알리기 위해 답을 업데이트 할 필요가 있습니다. 다른 지점에서이 작업을 수행했습니다. 유익한 의견을 보내 주신 @ stevebennet2 감사합니다
GrayedFox

53

가져올 때 삭제 된 원격 브랜치에 대한 참조를 자동으로 제거하도록 Git을 구성 할 수 있습니다.

git config --global fetch.prune true

전화를 걸 git fetch거나 git pull나중에 삭제 된 원격 지점에 대한 참조가 자동으로 제거됩니다.


5
이것은 로컬 브랜치를 제거하지 않고 단지 참조 만 하는가?
클린트 이스트우드

@ClintEastwood 원격 브랜치에 대한 참조 만 삭제 합니다. 를 사용하여 원격 분기에 대한 참조를 나열 할 수 있습니다 git branch -r.
wedesoft 2016 년

52

당신을 위해 깔끔한 NPM 패키지가 있습니다 (그리고 크로스 플랫폼에서 작동해야합니다).

다음과 같이 설치하십시오. npm install -g git-removed-branches

그런 다음 git removed-branches모든 부실 지역 분기를 표시하고 git removed-branches --prune실제로 삭제합니다.

자세한 정보는 여기에 있습니다.


1
이것은 실제로 더 많은 투표를해야합니다. 플랫폼에 관계없이 삶을 편하게 해주셔서 감사합니다.
암호화

편리한 작은 확장. 주의 사항 : 병합되지 않은 브랜치를 정리할 수있는 것으로 간주합니다 (브랜치 -d가 호출 된 경우 --prune을 실행할 때 오류가 발생 함). 표시된 목록.
user2864740

1
이것은 내가 가장 좋아하는 답변입니다. npx git-removed-branches꿈처럼 작동합니다.
Drazisil

예! 더 많은 투표를해야합니다! cli의 초보자를위한 매우 간단하고 직관적 인 솔루션
geoseong

git의 관점에서 도구가 수행하는 작업에 대한 개요를 제공하는 것이 유용합니다.
ryanwebjackson

41

Windows 솔루션

Microsoft Windows Powershell의 경우 :

git checkout master; git remote update origin --prune; git branch -vv | Select-String -Pattern ": gone]" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}

설명

git checkout master 마스터 브랜치로 전환

git remote update origin --prune 먼 가지를 가지 치기

git branch -vv모든 분기의 자세한 출력을 얻습니다 ( git reference )

Select-String -Pattern ": gone]" 원격에서 제거 된 레코드 만 가져옵니다.

% { $_.toString().Split(" ")[0]} 지사 이름을 얻다

% {git branch -d $_} 지점을 삭제합니다


좋은 예입니다. 또는 git remote prune originselect, select-string이 최신 버전의 git과 일치하지 않는 것 같습니다. 사용 고려ConvertFrom-String -TemplateContent
Bernie White

3
최신 버전의 git은 후행 공백을 추가하는 것처럼 보이므로 Split은 분기 이름을 가져 오는 데 작동하지 않습니다. .toString (). Trim (). Split ( "")을 수행하면됩니다.
Chris Hynes

여기 내 것이있다 :git checkout master; git pull; git remote prune origin; git branch --merged | select-string -notmatch "master" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}
Omzig

@Omzig 어떻게 다르게 작동합니까? 설명을 해 주
시겠습니까?

@ chris31389, 나는 마스터에서 누락 된 모든 것을 얻기 위해 거기에 끌어 섰고 분기를 --merged가 아닌 master로 변경했습니다. 나는 --merged 분기 만 삭제하고 싶습니다. 기분이 나아진다;)
Omzig

27

원격 추적 분기가 원격에서 삭제 된 로컬 분기를 나열합니다.

$ git remote prune origin --dry-run

추적되지 않은 로컬에서이 로컬 분기를 역 참조하려면

$ git remote prune origin

19
이것은 질문에 대한 답변이 아니며 OP가 이미 알고있는 것입니다.
Ken Williams

2
또한 동의하지만 "더 이상 원격에 존재하지 않는 로컬 추적 분기를 정리하는 방법"을 검색하면이 링크가 맨 위 링크이며이 답변이 제목과 일치합니다 (문제에 대한 자세한 설명을 읽지 않은 경우는 아님). 투표 수의 이유입니다 :)
027

로컬 분기는 제거되지 않습니다. 이것을 실행 한 후에도 여전히
Xin

@Xin은 --dry-run 인수없이 명령을 실행하여 실제로 명령을 실행하지 않지만 변경 내용을 보여줍니다.
Torsten Ojaperv

19

@tzacks가 지적한 것처럼 ...이 작업에 유용한 npm 패키지가 있습니다. 그냥 해:

npx git-removed-branches --prune

(나는 논평했지만 평판이 충분하지 않았다)


1
화려한. 번거 로움이 없습니다. 이것이 정답이었습니다.
Dan Rayson

1
맨 위에 있어야합니다. Windows에서도 작동합니다.
tomtastico

14

Windows 및 Powershell을 사용하는 경우 다음을 사용하여 현재 체크 아웃 한 지점으로 병합 된 모든 로컬 지점을 삭제할 수 있습니다.

git branch --merged | ? {$_[0] -ne '*'} | % {$_.trim()} | % {git branch -d $_}

설명

  • 현재 분기와 병합 된 분기를 나열합니다.
  • 현재 분기를 필터링합니다
  • git나머지 각 분기 이름에 대한 출력 에서 선행 또는 후행 공백을 정리합니다.
  • 병합 된 로컬 브랜치를 삭제합니다.

git branch --merged예상 한 것만 제거 할 수 있도록 먼저 실행 하는 것이 좋습니다.

( http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/ 에서 포팅 / 자동화되었습니다 .)


10

더 짧고 안전한 원 라이너 :

git branch -d $(git branch --merged | cut -c 3- | grep -v master)

아직 병합되지 않은 분기를 체크 아웃 한 후에 실행하십시오. 현재 체크인 한 지점을 삭제할 수 없기 때문입니다.


3
이것은 또한 '마스터'를 제거합니까?
dcsan

2
현재 master에 체크인 한 경우 no, 그렇지 않으면 yea
FelikZ

1
마스터를 건너 뛰려면 grep으로 파이프하고 역을 선택하면됩니다. – git branch -d $(git branch --merged | cut -c 3- | grep -v master)
mozillalives

이것은 안전하지 않은 미래에 누군가가 무의식적으로 자신의 마스터 지점 삭제합니다
jasonseminara

1
@jasonseminara #dcsan 스 니펫을 업데이트 했으므로 마스터 분기를 건너 뜁니다. #mozillalives thanks
FelikZ

9

나는에, 원격 지점을 추적 한 모든 지역 지점 제거 할 것을 원 origin원격 지점이 삭제 된 곳을 ( gone). 원격 지점을 추적하도록 설정되지 않은 로컬 지점 (예 : 로컬 로컬 지점)을 삭제하고 싶지 않았습니다. 또한 git사용자 정의 스크립트를 작성하는 대신, 또는 다른 간단한 CLI 도구를 사용하는 간단한 단일 라이너가 필요했습니다 . 나는 약간의를 사용하여 종료 grepawk간단한 명령을 만들기 위해, 다음 내에서 별칭으로 추가 ~/.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플래그를 사용 git branch하면 매우 위험 할 수 있습니다. 따라서 위의 config 명령에서 -d옵션을 git branch대신 사용합니다 -D. -D실제 구성에서 사용 합니다. -DGit이 병합되지 않은 가지에 대해 불평하는 것을 듣고 싶지 않기 때문에 사용 합니다. 이 기능도 필요할 수 있습니다. 그렇다면 해당 config 명령 끝에 -D대신 사용 -d하십시오.


8

원격 분기를 제거하려면

$git remote prune origin

이미 병합 된 로컬 분기를 제거하려면

$git branch -D $(git branch --merged)

나를 위해 작동합니다. 감사.
AndroidRuntimeException

2
(git branch --merged)도 나를 위해 '마스터'를 반환합니다. 그리고 리모콘에서 삭제되지 않은 다른 지점.
Tom G

8
마스터 분기가 삭제되었습니다.
그렉

5

안전한 원 라이너, 너무 많은 경우 (예 : 이름의 일부로 "마스터"가있는 지점 등)가없는 것 같습니다. 가장 안전한 단계는 다음과 같습니다.

  1. git branch -vv | grep 'gone]' > stale_branches.txt
  2. 파일을보고 유지하려는 분기 (예 : 마스터 분기!)의 행을 제거하십시오. 라인의 내용을 편집 할 필요가 없습니다
  3. awk '{print $1}' stale_branches.txt | xargs git branch -d

5

위의 답변을 바탕 으로이 짧은 라이너를 사용하고 있습니다.

git remote prune origin | awk 'BEGIN{FS="origin/"};/pruned/{print $2}' | xargs -r git branch -d

또한 이미 정리하고 로컬 매달려 분기가 있으면 정리합니다.

git branch -vv | awk '/^ .*gone/{print $1}' | xargs -r git branch -d

1
지사 이름이있는 경우 작동하지 않습니다 /그들에
theicfire

4

한 번에 모두 수행하는 방법을 모르지만 자식 git branch -d <branchname> 은 로컬 분기가 완전히 병합 된 경우에만 로컬 분기를 삭제합니다. 소문자에 유의하십시오. d.

git branch -D <branchname> (자본 D 참고) 병합 상태에 관계없이 로컬 지점을 삭제합니다.


Windows에서는 다른 답변이 효과가 없었습니다. 분기가 이미 "삭제 된"경우에도 간단한 -D 스위치와 함께이 답변을 사용했습니다.

모든 지점에서 한 번에 할 수 있습니까?
Teoman shipahi

3

이 명령을 사용할 수 있습니다 :

git branch --merged master | grep -v "\* master" | xargs -n 1 git branch -d

힘내 청소 : 명령 분석을 포함하여 이미 병합 된 분기 삭제


실제로 분기를 필터링 할 필요는 없습니다 (예 : 마스터). "병합 된"경우 이는 로컬 사본을 제거하지만 "git checkout dev"는 원격에서 로컬 분기를 작성 함 (아직없는 경우)
csga5000

그러나 로컬 브랜치리스트는 병합 되더라도 여전히 존재합니다. 이 명령은 원격에서 삭제 된 분기를 제거합니다.
sendon1982

시작 부분에 별표가 있으면 현재 분기를 의미합니다. 다른 분기에서 해당 명령을 실행하면 제대로 작동하지 않습니다.
OzzyCzech

2

위의 답변을 바탕 으로이 한 줄 솔루션을 제공했습니다.

git remote prune origin; git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d

2

@wisbucky의 답변에 변형을 사용하여 ~/.gitconfig파일에 별칭으로 다음을 추가했습니다 .

pruneitgood = "!f() { \
    git remote prune origin; \
    git branch -vv | perl -nae 'system(qw(git branch -d), $F[0]) if $F[3] eq q{gone]}'; \
}; f"

이를 통해 간단 git pruneitgood하게 병합 후 더 이상 필요하지 않은 로컬 및 원격 분기를 모두 정리합니다.


2

Powershell 버전 git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d

git branch --merged master | %{ if($_ -notmatch '\*.*master'){ git branch -d "$($_.Trim())" }}

마스터 브랜치에있는 동안 마스터로 병합 된 모든 로컬 브랜치가 제거됩니다. .

git checkout master 전환합니다.


1

Schleis의 변형이 저에게 효과적이지 않으므로 (우분투 12.04) 변형을 제안하십시오 :

변형 1 (이 옵션을 선호합니다) :

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

변형 2 :

ㅏ. 드라 이런 :

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | awk '{print "git branch -D " $1}'

비. 가지 제거 :

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | xargs git branch -D

1

다음은 Windows 사용자를위한 @wisbucky의 답변입니다.

for /f "tokens=1" %i in ('git branch -vv ^| findstr ": gone]"') DO git branch %i -d

나는 posh-git을 사용하고 불행히도 PS는 naked를 좋아하지 않으므로 forPruneOrphanBranches.cmd라는 일반 'ol 명령 스크립트를 만들었습니다.

@ECHO OFF
for /f "tokens=1" %%i in ('git branch -vv ^| findstr ": gone]"') DO CALL :ProcessBranch %%i %1

GOTO :EOF

:ProcessBranch
IF /I "%2%"=="-d" (
    git branch %1 %2
) ELSE (
    CALL :OutputMessage %1
)
GOTO :EOF

:OutputMessage
ECHO Will delete branch [%1] 
GOTO :EOF

:EOF

매개 변수없이 호출하여 목록을보고 "-d"로 호출하여 실제 병합을 수행하지 않거나 완전히 병합되지 않았지만 삭제하려는 분기에 대해 "-D"를 호출하십시오.


이것은 나에게 효과가 없었습니다. 어쨌든 :또는 : (공간이 있음)으로 findstr인해 매번 모든 것과 일치합니다. 거의 주인을 거의 삭제했습니다. 그러나 정규 표현식을 사용하면 정상적으로 작동했습니다.git branch -vv ^| findstr /R " \[origin/[0-9]+: gone\] "
Josh

1

git bash에서 이것을 시도하여 삭제 된 분기에 대한 참조를 가져오고 제거 한 다음 제거 된 분기를 추적하는 로컬 분기를 제거하십시오.

git fetch -p && git branch -d `git branch -vv | grep ': gone]' | awk '{print $1}' | xargs`

삭제되지 않는 브랜치를 먼저 체크 아웃해야 브랜치 삭제가 차단되지 않습니다.


0

나는 받아 들인 대답을 강력한 스크립트로 바꿨다. 내 git-extensions 저장소에서 찾을 수 있습니다 .

$ git-prune --help
Remove old local branches that do not exist in <remote> any more.
With --test, only print which local branches would be deleted.
Usage: git-prune [-t|--test|-f|--force] <remote>

0

"더 이상 업스트림 분기가없는 로컬 체크 아웃 분기를 삭제하는 방법"에 대한 답변을 찾는이 페이지에 도달했습니다.

또한 로컬 브랜치가 아직 병합되었는지 여부에 대해서는 신경 쓰지 않았습니다 git branch -d. 병합되지 않은 로컬 브랜치를 삭제하는 대신 파이프에 연결 하면 단순히 경고하기 때문입니다.

git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3 | egrep -v -f /dev/fd/0 <(git branch -a | grep -v origin) | grep branch_prefix_that_I_care_about | xargs git branch -d

# translation
# git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3
## this finds all remote branch names minus the "remote/origin/" part
#
# <(git branch -a | grep -v origin)
## this finds all local branch names and redirects it into the previous command
#
# egrep -v -f /dev/fd/0 STUFF
## this is doing some weird magic that I'm grokking as "take the set difference from whatever was piped in"
#
#
# overall translation: (STUFF TO CONSIDER) | egrep magic <(STUFF TO REMOVE FROM CONSIDERATION) | do cool things with resulting stuff


0

내 해결책은 다음과 같습니다.

git fetch -p
git branch -vv | grep ": gone" | awk '{print $1}' | xargs git branch -d
  • -p 는 더 이상 원격에 존재하지 않는 원격 추적 참조를 제거하는 것입니다. 따라서 첫 번째 단계는 원격 브랜치에 대한 참조를 제거합니다.

  • -vv 는 업스트림 브랜치 (있는 경우)와 함께 sha1 및 커밋 제목을 각 헤드에 표시하기위한 것입니다. 두 번째 단계는 모든 로컬 분기를 가져오고 grep 명령은 삭제 된 분기를 필터링합니다.


-2

master로 최신이 아닌 지점을 삭제하십시오.

git co master && git branch | sed s/\*/\ / | xargs git branch -d 2> /dev/null

-3

나는 git remote prune origin그것이 당신이 원하는 것이라고 확신합니다 .

변경하지 않고 수행 작업 git remote prune origin --dry-run을 확인하기 위해 실행할 수 있습니다 .


12
이것은 실제로 로컬 브랜치 자체를 제거하지는 않습니다.
Taytay

-17

GUI를 사용하십니까? 수동 절차이지만 빠르고 쉽습니다.

$ git gui

"지점-> 삭제"를 선택하십시오. Ctrl- 클릭 (창)으로 여러 가지를 선택하고 모두 제거 할 수 있습니다.


이 답변이 얼마나 부정적으로 인식되는지는 재미있다. GUI를 좋아한다면 완전히 유효한 접근법 IMO.
serraosays
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.