Git을 사용하여 하나의 명령으로 여러 분기를 삭제할 수 있습니까?


355

예를 들면 : 나는 세 가지의 톤이 내 로컬 저장소, 청소하고 싶습니다 3.2, 3.2.1, 3.2.2, 등

나는 한 번에 많은 것을 제거하기 위해 비열한 방법을 원했습니다. 그들은 대부분 도트 릴리스 규칙을 따르기 때문에 어쩌면 말할 지름길이 있다고 생각했습니다.

git branch -D 3.2.*

3.2.x 가지를 모두 죽입니다.

나는 그 명령을 시도했지만 물론 작동하지 않았습니다.


11
git branch -D $(git branch | grep 3.2*)-이것은 나를 위해 일했다. 이름이 "3.2"로 시작하는 분기를 삭제합니다. grep-출력에서 패턴 일치 ( git branch이 경우) $()-결과를 실행하고 배치하는 것을 의미합니다. |-체인.
에두아르

4
모르는 사람들을 위해 주목할 가치, -DA는 강제 삭제는 사용해야 -d첫번째 안전한 것으로 대부분의 경우.
redfox05

답변:


363

해당 구문이 아닙니다. 그러나 다음과 같이 할 수 있습니다.

git branch -D 3.2 3.2.1 3.2.2

기본적으로 자식 분기는 단일 호출로 여러 분기를 삭제합니다. 불행히도 지점 이름 완성을하지 않습니다. bash에서는 다음을 수행 할 수 있습니다.

git branch -D `git branch | grep -E '^3\.2\..*'`

2
완성 git branch -D/-d은 저에게 잘 작동합니다. 가장 최근의 git.git contrib 디렉토리에서 업데이트 할 수 있습니다.
Cascabel

19
대신을 git branch | ...사용할 수 있습니다 $(git for-each-ref --format='%(refname:short)' refs/heads/3.*). 더 길지만 알다시피 적절한 출력이 보장되는 반면 스크립트 및 한 줄짜리에서 엉망이 될 수있는 및 (symrefs) 와 git branch같은 결과가 꽤 좋습니다. *->
Cascabel

3
어쩌면 나는이 문제에 유일한 사람이야,하지만 난 한 grep항상 플래그를 포함 별칭 --color=always- git branch -D던지고 error: branch 'my_branch' not found.나는 색상 플래그없이 실행까지.
eebbesen

@eebbesen 전역으로 비활성화 했습니까? 실행할 때도 같은 문제가 발생합니다git branch --merged ${1-$(current_branch)} | grep -v ${1-$(current_branch)} | xargs git branch -d
qmmr

2
중괄호 확장을 사용하면 git branch -D 3.2{,.1,.2}세 가지 모두 gnu.org/software/bash/manual/html_node/Brace-Expansion.html
robstarbuck

147

최악의 경우 다음을 사용할 수 있습니다.

git branch | grep '3\.2' | xargs git branch -d

22
이것은 분기 이름에 대해 표준화 된 접두사 표기법을 사용하는 모든 사람에게 완벽한 방법입니다 (예 : "fix / ..."또는 "feature / ...").
Haz

4
간단하고 효율적입니다! | xargs git branch -d실제로 삭제할 내용을 확인하기 위해 부분 없이 먼저 실행하는 것이 좋습니다 .
mathielo

구문 분석이 아닌 읽기 전용으로 grep의 출력에는 사용 하지 않는 것이 좋습니다 git branch. 언제든지 변경할 수 있습니다. 다른 답변에서 제안 된대로 매개 변수 for-each-ref와 함께 사용 --format하고이 답변의 제안과 결합하십시오.
redfox05

138
git branch  | cut -c3- | egrep "^3.2" | xargs git branch -D
  ^                ^                ^         ^ 
  |                |                |         |--- create arguments
  |                |                |              from standard input
  |                |                |
  |                |                |---your regexp 
  |                |
  |                |--- skip asterisk 
  |--- list all 
       local
       branches

편집하다:

자식 브랜치 출력은 스크립팅에 사용되지 않기 때문에 더 안전한 버전 (Jakub Narębski 및 Jefromi에서 제안) :

git for-each-ref --format="%(refname:short)" refs/heads/3.2\* | xargs git branch -D

... 또는 xargs-free :

git branch -D `git for-each-ref --format="%(refname:short)" refs/heads/3.2\*`

14
git branch스크립팅에 출력을 사용하지 마십시오 . 사용하십시오 git for-each-ref.
Jakub Narębski

1
@ 기호가있는 태그를 삭제하려면 :git for-each-ref --format="%(refname:short)" refs/tags/\*@\* | xargs git tag -d
thaddeusmt

오타가 있습니다. "/3.2*"가 아닌 "/3.2/*"여야합니다. 또한 다른 답변을 붙여 넣은 것으로 나타납니다.
Max MacLeod

오타가 없습니다. 매뉴얼 페이지에서 :If one or more patterns are given, only refs are shown that match against at least one pattern, either using fnmatch(3) or literally, in the latter case matching completely or from the beginning up to a slash
gawi

1
모르는 사람들을 위해 주목할 가치, -DA는 강제 삭제는 사용해야 -d첫번째 안전한 것으로 대부분의 경우.
redfox05

115

git branch --list를 사용하여 적합한 분기를 나열하고 git branch -D / -d를 사용하여 적합한 분기를 제거 할 수 있습니다.

한 라이너 예 :

git branch -d `git branch --list '3.2.*'`

이것을 시도하면과 같은 오류 메시지가 나타납니다 error: branch 'package.json' not found.. *가 너무 일찍 확장되어 모든 파일 및 디렉토리의 이름에 해당하는 분기를 삭제하려고합니다.
안티몬

이것은 잘 작동합니다! 나는 이것을 별명으로 사용하는 데 문제가 있습니다 gitconfig...
whomaniac

6
이 답변은 목록에서 더 높아야하고, 매우 깨끗하고, 작동하며, grep이 없습니다
jemiloii

1
발급만으로 쉽게 테스트 할 수 있다는 것이 git branch --list '3.2.*'
Will

3
창에서git branch -d (git branch --list '3.2.*').trim()
Mattias Josefsson

38

최근에, 나는 같은 문제의 해결책을 찾고 있었고 마침내 나는 하나의 대답을 찾았으며 매우 잘 작동하고 있습니다.

  1. 터미널 또는 이와 동등한 것을 엽니 다.
  2. 자식 분기에 입력 | 삭제 될 분기의 미리보기를 위해 grep "pattern".
  3. 자식 분기에 입력 | grep "패턴"| xargs 자식 분기 -D

이 솔루션은 훌륭하며 각 명령에 대한 자세한 설명과 작동 방법을 보려면 여기에 나와 있습니다 .


28

사용하다

git for-each-ref --format='%(refname:short)' 'refs/heads/3.2.*' |
   xargs git branch -D

7
작은 팁은 "| xargs git branch -D"명령의 후자를 제거하면 일치하는 분기 만 출력한다는 것입니다. 따라서 삭제 될 분기를 미리 볼 수 있습니다
Max MacLeod

1
또한 나는 이것을 단순화하기 위해 별명을 추가했다 : alias grefs='git for-each-ref --format="%(refname:short)"'그래서 나는 할 수있다grefs | grep 'regexpattern' | xargs git branch -D
angularsen

그것을 사랑. 좋고 간단합니다!
Bhargav Ponnapalli

15

아마도 당신은 이것을 유용하게 사용할 수있을 것입니다 :

예를 들어 'master', 'foo'및 'bar'가 아닌 모든 분기를 제거하려면

git branch -D `git branch | grep -vE 'master|foo|bar'`

grep -v 'something'은 반전 된 matcher입니다.


나는 개인적 -D으로 다른 답변 과 비교하여 옵션을 좋아 합니다. @Adi의 답변에 감사드립니다. 솔루션이 저에게 효과적입니다.
AMIC MING

9

나는 정확한 이유로 이니셜과 대시 (at-)를 브랜치 이름의 처음 세 문자로 넣습니다.

git branch -D `git branch --list 'at-*'`

모든 대답은 기본적으로 이것을 말합니다. 이것은 가장 간단합니다.
tfantina

7

git 명령 프롬프트 사용에 국한되지 않으면 언제든지 git guiBranch-> Delete 메뉴 항목을 실행 하고 사용할 수 있습니다 . 삭제하려는 모든 분기를 선택하고 리핑하십시오.


이것은 단지 당신이 비록 현지 지점을 삭제할 수 있습니다
스텔스 랍비

7

파워 쉘 솔루션 :

창을 실행중인 경우 PowerShell을 사용하여 여러 분기를 한 번에 제거 할 수 있습니다.

git branch -D ((git branch | Select-String -Pattern '^\s*3\.2\..*') | foreach{$_.ToString().Trim()})
//this will remove all branches starting with 3.2.

git branch -D ((git branch | Select-String -Pattern 'feature-*') | foreach{$_.ToString().Trim()})
// this will delete all branches that contains the word "feature-" as a substring.

Powershell의 Select-String 명령을 사용하여 패턴 일치가 작동하는 방식을 미세 조정할 수도 있습니다. powershell 문서를 살펴보십시오 .


6

"개발"을 유지하고 로컬의 다른 모든 것을 삭제하십시오.

    git branch | grep -v "develop" | xargs git branch -D 

5

@gawi (위)에서 제공 한 답변을 기반으로 유용한 작은 기능을 만들었습니다.

removeBranchesWithPrefix() {
  git for-each-ref --format="%(refname:short)" refs/heads/$1\* | xargs git branch -d
}

그것을 당신에 추가하고 .bash_profile터미널을 다시 시작하십시오. 그런 다음 명령 줄에서 다음과 같이 호출 할 수 있습니다.

removeBranchesWithPrefix somePrefix

노트

현재 소프트 삭제로 설정되어 있습니다. 즉, 병합되지 않은 분기를 삭제하지 않습니다. 당신은 가장자리의 변화에 살기를 좋아하는 경우 -d-D와 관계없이 접두사로 모든 것을 삭제합니다!


5

모든 가지를 깨끗이 청소해야한다면

git branch -d $(git branch)

현재 체크인중인 분기를 제외한 모든 로컬 병합 분기가 삭제됩니다.

지역을 깨끗하게 만드는 좋은 방법입니다


이것은 나를 위해 충분히 효과가있었습니다. 동일한 명령을 사용하지만 "-d"대신 대문자 "-D"를 사용하여 제거한 지점을 제외한 두 개의 브랜치를 남겼습니다. 파일을 찾지 못하는 자식에 대한 오류가 있지만 분기가 삭제되었습니다.
Lurifaxel

3

이 작은 항목이 마음에들 수 있습니다 ... 목록을 가져 와서 모든 선택 항목을 삭제하기 전에 각 항목의 확인을 요청합니다 ...

git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "remove branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done`

-D를 사용하여 삭제를 강제 실행하십시오 (평소와 같이).

가독성을 위해 여기에 한 줄씩 나뉘어 있습니다 ...

git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* |
    while read -r line; do 
        read -p "remove branch: $line (y/N)?" answer </dev/tty;
        case "$answer" in y|Y) echo "$line";; 
        esac; 
    done`

여기 xargs 접근법이 있습니다 ...

git for-each-ref --format="%(refname:short)" refs/heads/\* |
while read -r line; do 
    read -p "remove branch: $line (y/N)?" answer </dev/tty;
    case "$answer" in 
        y|Y) echo "$line";; 
    esac; 
done | xargs git branch -D

마지막으로, 나는 이것을 .bashrc에 가지고 싶다.

alias gitselect='git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "select branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done'

그렇게하면 그냥 말할 수 있습니다

gitSelect | xargs git branch -D.

3

여기서 PowerShell을 사용하는 순수한 영혼을 위해 작은 스크립트 git branch -d $(git branch --list '3.2.*' | %{$_.Trim() })


2

그것은 나를 위해 올바르게 작동합니다 :

git branch | xargs git branch -d

git branch | xargs git branch -D

모든 현지 지점 삭제


2

다음 명령을 사용하여 모든 분기를 제거하십시오 (체크 아웃 된 분기는 삭제되지 않음).

git branch | cut -d '*' -f 1 | tr -d " \t\r" | xargs git branch -d

편집 : 나는 맥 OS를 사용하고 있습니다


0

나는 당신이 창문에 있습니다.

 git branch | grep 'feature/*' |% { git branch -D $_.trim() }

feature/*원하는 패턴으로 교체하십시오 .


6
grep은 나를 위해 인식되지 않는 cmdlet입니다 ... 그래서이 자식 분기로 변경했습니다 | where {$ _. Trim (). StartsWith ( "bug")} | % {git branch -D $ _. Trim ()} 그리고 작동했습니다!
Alex


0

git gui한 번에 여러 분기를 삭제하는 데 사용할 수 있습니다 . 명령 프롬프트 / 배시-> git gui-> 원격-> 분기 삭제 ...-> 제거하려는 원격 분기를 선택하십시오-> 삭제.


0

나는 방금 쓸모없는 지역 / 원격 지점을 오늘 정리했습니다.

아래는 내가 한 방법입니다.

1. 모든 분기 이름을 텍스트 파일로 나열하십시오.

자식 분기 -a >> BranchNames.txt

2. "git branch -D -r"명령에 삭제하려는 분기를 추가하십시오.

git branch -D -r origin / dirA / branch01 origin / dirB / branch02 origin / dirC / branch03 (... 분기 이름 추가)

3. cmd를 실행

그리고 이것은 " git push origin --delete " 보다 훨씬 빠르고 안정적으로 작동합니다 .

이것은 다른 답변에 나열된 가장 현명한 방법은 아니지만이 방법은 매우 간단하고 사용하기 쉽습니다.


0

Windows 용 기본 애드온 인 Git GUI를 설치 한 경우 가장 간단합니다. ctrl을 사용하여 여러 가지를 선택하고 한 번의 클릭으로 삭제할 수 있습니다.


0

Fish shell을 사용하는 경우 다음 string기능을 활용할 수 있습니다 .

git branch -d (git branch -l "<your pattern>" | string trim)

이것은 다른 답변 중 Powershell 옵션과 크게 다르지 않습니다.


0

텍스트 파일 (branches-to-del.txt)에서 모든 분기를 삭제 한 경우 (한 줄에 한 분기) 원격 (원점)에서 이러한 분기를 모두 삭제할 수 있습니다. xargs -a branches-to-del.txt git push --delete origin


-1

Git에서와 같이 모든 브랜치는 git repo에 대한 참조로 아무것도 아닙니다.가는 가지를 삭제 .git/ref하고 저장소에서 흥미롭지 않은 것이 남은 경우 자동으로 가비지 수집되므로 자동으로 가비지 수집되지 않습니다. 귀찮게해야합니다.



-4

불필요한 모든 참조를 제거하는 모든 분기를 제거 할 수 있습니다.

rm .git/refs/heads/3.2.*


2
다음과 같은 두 가지 이유가 있습니다. 1. 구현 세부 사항을 사용합니다 (현재 버전의 Git이 브랜치를 특정 디렉토리에 파일로 저장한다는 사실). 이것은 향후 버전에서 변경되어 답변이 유효하지 않을 수 있습니다. 2. 저장소가 별도의 디렉토리 에 있으면 작동하지 않습니다 .
axiac

또한 압축 된 저장소 ( git gc) 에서 실행하면 예상치 못한 결과가 발생합니다 . 하지마
Matthieu Moy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.