git에서 여러 원격 분기 삭제


128

실수로 150 개가 넘는 지역 지점을 중앙 저장소로 푸시 한 팀원이 있습니다. 고맙게도 그들은 모두 같은 접두사를 가지고 있습니다. 그 접두사를 사용하면 한 번에 모든 것을 삭제할 수있는 git 명령이나 멋진 작은 쉘 스크립트가 있습니까?

답변:


150

다음 명령을 사용하여 PREFIX원격 서버 에서 접두사가있는 모든 분기를 제거 합니다.

git branch -r | awk -F/ '/\/PREFIX/{print $2}' | xargs -I {} git push origin :{}

제거 할 분기인지 확인하기 위해 먼저 드라 이런을 수행 할 수 있습니다.

git branch -r | awk -F/ '/\/PREFIX/{print $2}'

2
원 라이너라서 먼저 드라 이런을 할 수있어서 좋아요. 불행하게도,이 메시지와 그것을 밖으로 오류 : $ git branch -r | awk -F/ '/\/APR/{print $2}' | xargs -I {} git push origin :{} error: unable to push to unqualified destination: APR-04-DPH The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'GIT_URL'
제이크 A. 스미스

를 사용하면 git branch -r | awk -F/ '/\/APR/{print $2}'나열된 모든 APR 접두사 지점 이름을 볼 수 있습니까?
neevek

1
APR-04-DPH좋습니다. 분기가 이미 삭제 되었기 때문 입니다. 이러한 대답 질문을 살펴보세요 또한 . 이러한 질문에 대한 답변은 동일한 문제를 해결하므로 직접 솔루션을 테스트 할 수 있습니다.
neevek

26
브랜치 이름에 /가있는 경우 (git-flow 등을 사용하는 경우) 대신 {$ 2 "/"$ 3}를 인쇄합니다
ajma

4
Windows에서 msysgit을 사용하고 있으며 다음 명령이 저에게 효과적이었습니다 (슬래시가 포함 된 분기 이름에 대한 @ajma의 주석과 함께 사용).git branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
rikoe

96

예를 들어 더 간단한 방법을 원한다면 3 개 또는 4 개의 브랜치를 삭제하십시오.

git push origin --delete <branch1> <branch2> <branch3>

중요 : Git v1.7.0 이상 에서만 작동합니다 .


6
나는 사용하게되었다git branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
Aram Kocharyan 2016 년

36

훌륭하고 우아한 솔루션에 대한 Neevek 에게 감사드립니다 !

하지만 난 때문에 지점 이름에 슬래시 몇 가지 문제 (내가 망할 놈의 흐름을 사용하고 있습니다),이 awk필드 분리 /( -F옵션)

따라서 내 솔루션은 Neevek의을 기반으로 하지만 분기 이름을 /. 이 경우 리모컨이 origin. 이름이 PATTERN다음 과 같은 원격 분기를 삭제하는 명령 :

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}' | xargs -I {} git push origin :{}

그리고 삭제할 항목을 확인하는 것을 잊지 마십시오.

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}'

유용한 팁 : 분기 이름 ( origin/접두사 없음)이 텍스트 파일 (한 줄에 하나의 분기 이름)에 저장된 경우 다음을 실행하십시오.

cat your_file.txt | xargs -I {} git push origin :{}

2
사용 xargs -a file -L대신에 cat file | xargs. 더 간단 xargs -a file git push --delete origin합니다.
musiKk 2015 년

15

이것은 중복 답변 일 수 있지만 아래에서 테스트되어 완벽하게 작동했습니다.

  1. 로컬 브랜치를 강제 삭제

git branch -D branch-name

  1. 원격 지점 삭제

git push origin --delete branch-name

  1. 2 개 이상의 로컬 브랜치 삭제

git branch -D branch-name1 branch-name2

  1. 둘 이상의 원격 지점 삭제

git push origin --delete branch-name1 branch-name2

  1. 접두사가있는 로컬 분기를 삭제합니다. 예 : feature / *

git branch -D $ (git branch --list 'feature / *')

git branch -D backticks $ (git branch --list 'feature / *' backticks )

  1. 접두사가있는 원격 지점을 나열합니다.

자식 분기 -r | grep -Eo '기능 /.*'

  1. 접두사가있는 원격 지점 삭제

자식 분기 -r | grep -Eo '기능 /.*'| xargs -I {} git push origin : {}


2
나는 당신이 5 단계에서 백틱을 피하려고했다고 생각합니다
GPL

백틱을 추가하는 방법은 무엇입니까?
Naren

1
@Naren : 문제는 마크 다운 형식이 백틱을 스타일링 명령으로 바꾸는 것입니다. 다른 명령 대체 방법으로 대체했습니다 (예 : "$ (command)"는`command`와 동일하지만 마크 다운에 의해 이상한 것으로 변환되지 않습니다.) 또 다른 방법은 '\'로 백틱을 이스케이프하는 것입니다.
Stabledog

13

grep : git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}.

branch -rorigin/prefix/branchname. 그래서 그것은 걸릴 것 prefix/branchname입니다.


당신이 의미하는 것 같아요 xargs -I {} git push origin :{} 아니라고-i .
jojo

1
@jojo, AFAIK, -i기본 대체를 사용 {}하지만 -I사용자가 직접 선언 할 수 있습니다. ... 매뉴얼에서 찾을 수 있습니다.-i ... the same as -I{}
Kirby

10

Neevek의 솔루션은 우아하지만 더 나을 수 있습니다. 제안 된 솔루션은 분기당 한 번 'git push'를 호출하므로 삭제할 분기당 추가 네트워크 왕복이 필요합니다. 어쨌든 awk를 사용하고 있기 때문에 ':'접두사에 awk를 사용하면 xargs가 정확히 한 번 'git push'를 호출하고 모든 분기를 한 번에 삭제할 수 있습니다.

삭제 될 분기를 나열하려면 테스트 실행 :

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}'

실제로 삭제를 푸시하는 최종 솔루션 :

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}' | xargs git push origin

2
낮은 버전의 bash를 사용하거나 Windows 버전의 git bash를 사용할 때 xargs에 "-I"옵션을 사용할 수없는 상황에서 완벽하게 작동합니다.
zchholmes

나는 xargs: replstr may not be emptyNeevek의 솔루션, 어쩌면 git 버전을 가지고 있었다. git version 1.9.5그러나 이것은 나를 위해 잘 작동했다. 여러분 모두 감사합니다
IamFace

8

리소스 https://coderwall.com/p/eis0ba

    1 - List all your remote branches:

    $ git branch -r

    2 - Filter the branches by some regular expression. In this case I'm interested in deleting any branch with the 'feature-' prefix:

    $ git branch -r | awk -F/ '/\/feature-/{print $2}'
    3 - Pipe the last command to git push to delete them:
    # **Edit** - Removed extra colon, which is not needed
    $ git branch -r | awk -F/ '/\/feature-/{print $2}' | xargs -I {} git push origin {}
    4 - Grab a beer.

    5 - Remove any local reference to those branches:

    $ git remote prune origin

감사합니다. mu의 경우 여러 로컬 지점을 삭제할 수 있습니다. 감사!
Prashant Kabade 2017

5

Steve와 Neevek 덕분에 나에게 잘 맞는 솔루션을 찾았고 공유 할 가치가 있다고 생각했습니다.

Steve의 솔루션은 약간의 조정으로 나를 위해 일했습니다. 내 리모컨의 이름이 지정 origin/feature/some-feature-name되었으므로 다음 항목을 다듬 었습니다 awk.

git branch -r | awk -Forigin/ '/\/feature/ {print $2 $3}' | xargs -I {} git push origin :{}

이제 멋진 삭제 흐름을 수행하고 있습니다.

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
To github.com:project/project-name.git
- [deleted]         feature/search-placeholder
To github.com:project/project-name.git
- [deleted]         feature/server-error-message
To github.com:project/project-name.git
- [deleted]         feature/six-point-asterisk

누군가가 더 우아한 솔루션에 대한 아이디어를 가지고 있는지 궁금해하고 있었지만 다음과 같은 결과를 얻을 수 있습니다 (내 CLI 스크립팅은 매우 좋지 않으므로 이것을 알아내는 데 시간이 걸립니다).

git push origin :feature/search-min-chars :feature/search-placeholder :feature/server-error-message :feature/six-point-asterisk

이렇게하면 하나의 네트워크 요청으로 멋진 단일 출력이 생성됩니다.

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
- [deleted]         feature/search-placeholder
- [deleted]         feature/server-error-message
- [deleted]         feature/six-point-asterisk

4

Neevek에게 감사드립니다. 이것은 내 목적을 위해 재구성 한 후에 잘 작동했습니다.

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2 "/" $3}' | xargs -I {} git push origin :{}

또한 폴더 구조도 고려해야했습니다. 내 기능 분기는 origin / feature / PREFIX-FEATURENUMBER와 같은 폴더 구조에 있습니다. 그래서 저는 $ 2 = folder + $ 3 = branchname에서 패턴을 만들어야했습니다.


4

모두가을 사용 awk하고 있지만 그 이유 는 확실하지 않습니다. 좀 더 복잡한 것 같아요. 내 fork리모컨 에서 모든 원격 분기를 삭제하는 데 사용하는 방법은 다음과 같습니다 .

$ git branch -r --list 'fork/*' | sed 's/fork\///' | xargs git push --delete fork

목록을 원격 분기의 하위 집합으로 만 필터링해야하는 경우 와 grep사이 에을 넣으십시오 .xargssed


1
감사합니다. 이것은 실제로 모든 솔루션 중에서 나를 위해 일했습니다. grep은 origin/blaprefix_anotherbla. 그러나 사용 sed하면 잘 처리되었습니다. 이 접근 방식의 또 다른 장점은 bitbucket을 사용하고 모든 지점을 수동으로 삭제할 때마다 인증 암호를 입력 할 필요가 없다는 것입니다. 이것은 단일 배치에서 모든 분기를 삭제합니다.
Madhur Bhaiya

모든 그린 ​​키퍼 지점을 삭제하려면git branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
abhisekp

4

나는 이것이 git 명령에 대한 것이라는 것을 알고 있지만 유사하거나 동일한 결과를 수행하는 대체 솔루션을 찾고 있다면 :

여기에서 할 수 있습니다 (Git Remove Remote Branches) :

그런 다음 원하는 분기를 선택하십시오.

원격 분기를 제거 할 수있는 권한이 있는지 확인하십시오.


이것은 최고의 답변이어야하며 플랫폼에 독립적입니다.
karmington

소프트웨어는 무엇이며 Linux에서 사용할 수 있습니까?
abhisekp

1

Github에는 또한 분기를 빠르게 삭제하기위한 멋진 UI와 메커니즘이 있습니다. UI를 사용하려는 경우


1
예, 여기 에 문서화 되어 있지만 각 분기마다 한 번씩 클릭해야합니다. 여기에서 최고 투표 솔루션은 일치하는 정규식을 작성할 수있는 많은 분기를 수행하는 가장 좋은 방법입니다.
thewoolleyman

0

모든 origin / release / r1-1 * 원격 브랜치를 삭제하려고했기 때문에 다음 명령 줄이 잘 작동했습니다.

git branch -r | awk -Forigin/ '/\/*r1-1/ {print $2}' |  xargs -I {} git push origin :{}

0

브랜치 이름에 슬래시 구조를 사용하고 있기 때문에 awk를 사용할 수 없었습니다.

git branch -r | grep "origin/users/YOURNAME" | sed -r 's/^.{9}//'| xargs -i  sh -c 'git push origin --delete {}'

이것은 모든 원격 분기를 가져오고 단일 사용자에 대해 하나만 가져오고 "origin /"문자열을 원격으로 가져 와서 각각에 대해 삭제를 실행합니다.


0

드라 이런 :

git branch -r --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} echo {}

원격 분기 삭제 :

git branch -r --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} git push origin --delete {}

완전히 병합 된 원격 분기 만 삭제 :

git branch -r --merged --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} git push origin --delete {}

설명:

sed "s/origin\///"origin/지점 이름에서 제거 됩니다. 그것을 벗기지 않고 나는 얻었습니다.remote ref does not exist


0

이전 답변은 2018의 모든 릴리스 분기를 제거하는 데 도움이되었습니다. Windows 10 명령 프롬프트에서 이것을 실행했습니다. 클 링크를 설치했습니다 했으므로 Linux와 같은 명령이 나를 위해 작동합니다.

드라 이런 :

git branch -a | grep -o "release-.*2018" | xargs -I {} echo {}

드라 이런에 원격 / 원점에없는 분기가 표시되는 경우. git prune 명령을 실행하여 수정하고 다시 확인하십시오.

git remote prune origin

위의 결과에 만족하면 삭제하십시오.

git branch -a | grep -o "release-.*2018" | xargs -I {} git push origin --delete {}

표시되는 경우 : error: unable to delete 'release-...2018': remote ref does not exist. 그런 다음 이전 prune 명령을 실행하고 다시 시도하십시오.


-4

경고 : 모든 원격 분기가 삭제됩니다. 주의해서 사용하십시오.

원격 지점을 삭제하는 방법 이 최선 이라고 생각 합니다.

git branch -r | grep -v master | sed 's/origin\//:/'| xargs git push

경고 : 모든 원격 분기가 삭제됩니다. 주의해서 사용하십시오.


4
명백한 트롤로 찬성했습니다. 권한이 있으면 삭제합니다.
제이크 A. 스미스

어디에서 트롤링을 찾았습니까?
Dmytro Gorpynenko 2014

2
이것은 정확하지 않으며 xargs에 대한 몇 가지 중요한 인수를 놓치고 있으며 질문에 대답하지 않습니다.
Rob

그렙 -v 마스터 찾기 모두 같은 경우가 아니라 - JakeA.Smith 제이크 @, 난 당신이 코드가 원격 마스터 제거 할 생각 추측 을 제외하고 마스터.
바딤 사모 킨

@Rob 여기서 잘못된 것은 무엇입니까? 마지막으로 실행 된 명령문은 git push : some_branch : another_branch와 비슷합니다. 이는 절대적으로 정확합니다.
바딤 사모 킨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.