질문자 :Mailo Světel
원격 동등물이 더 이상 존재하지 않는 모든 추적 분기를 삭제하는 간단한 방법이 있습니까?
예시:
지점(로컬 및 원격)
- 주인
- 원산지/마스터
- 출처/버그 수정-a
- 출처/버그 수정-b
- 출처/버그 수정-c
로컬에는 마스터 브랜치만 있습니다. 이제 bug-fix- 에 대해 작업해야 하므로 확인하고 작업하고 변경 사항을 원격으로 푸시합니다. 다음으로 bug-fix-b 로 동일한 작업을 수행합니다.
지점(로컬 및 원격)
- 주인
- 버그 수정
- 버그 수정-b
- 원산지/마스터
- 출처/버그 수정-a
- 출처/버그 수정-b
- 출처/버그 수정-c
이제 로컬 브랜치 master , bug-fix-a , bug-fix-b 가 있습니다. 마스터 브랜치 관리자는 내 변경 사항을 마스터 로 병합하고 그가 이미 병합한 모든 브랜치를 삭제합니다.
따라서 현재 상태는 다음과 같습니다.
지점(로컬 및 원격)
- 주인
- 버그 수정
- 버그 수정-b
- 원산지/마스터
- 출처/버그 수정-c
이제 원격 저장소에 더 이상 표시되지 않는 분기(이 경우 bug-fix-a , bug-fix-b )를 삭제하는 명령을 호출하고 싶습니다.
기존 명령 git remote prune origin
과 비슷하지만 git local prune origin
과 비슷합니다.
git remote prune origin
은 원격에 있지 않은 추적 분기를 제거합니다.
git branch --merged
현재 브랜치에 병합된 브랜치를 나열합니다.
xargs git branch -d
는 표준 입력에 나열된 분기를 삭제합니다.
git branch --merged
나열된 분기를 주의해서 삭제하십시오. 목록에는 삭제하지 않으려 master
또는 기타 분기가 포함될 수 있습니다.
분기를 삭제하기 전에 목록을 편집할 수 있는 기회를 제공하려면 한 줄에서 다음을 수행할 수 있습니다.
git branch --merged >/tmp/merged-branches && \ vi /tmp/merged-branches && xargs git branch -d </tmp/merged-branches
aubreypwd명령 후
git fetch -p
실행할 때 원격 참조를 제거합니다.
git branch -vv
원격 상태로 'gone'이 표시됩니다. 예를 들어,
$ git branch -vv master b900de9 [origin/master: behind 4] Fixed bug release/v3.8 fdd2f4e [origin/release/v3.8: behind 2] Fixed bug release/v3.9 0d680d0 [origin/release/v3.9: behind 2] Updated comments bug/1234 57379e4 [origin/bug/1234: gone] Fixed bug
따라서 원격으로 이동한 로컬 분기를 제거하는 간단한 스크립트를 작성할 수 있습니다.
git fetch -p && for branch in $(git branch -vv | grep ': gone]' | awk '{print $1}'); do git branch -D $branch; done
위는 "porcelain" 명령 git branch
를 사용하여 업스트림 상태를 가져옵니다.
이 상태를 얻는 또 다른 방법은 "배관" 명령 git for-each-ref
를 보간 변수 %(upstream:track)
와 함께 사용하는 것입니다. 이 변수는 위와 같이 [gone]
이 접근 방식은 커밋 메시지의 일부에서 실수로 일치할 위험이 없기 때문에 다소 안전합니다.
git fetch -p && for branch in $(git for-each-ref --format '%(refname) %(upstream:track)' refs/heads | awk '$2 == "[gone]" {sub("refs/heads/", "", $1); print $1}'); do git branch -D $branch; done
jason.rickman이러한 답변의 대부분은 실제로 원래 질문에 대한 답변이 아닙니다. 나는 많은 파기를했고 이것이 내가 찾은 가장 깨끗한 솔루션이었습니다. 다음은 해당 답변의 약간 더 철저한 버전입니다.
- 기본 분기를 확인하십시오. 일반적으로
git checkout master
- 실행
git fetch -p && git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
설명:
git branch -vv
에서 "사라진" 것으로 표시되는 로컬 분기를 삭제하여 작동합니다.
노트:
언어가 영어가 아닌 다른 것으로 설정되어있는 경우에는 변경해야합니다 gone
적절한 단어. 로컬에만 있는 분기는 건드리지 않습니다. 원격에서 삭제되었지만 병합되지 않은 분기는 알림을 표시하지만 로컬에서는 삭제되지 않습니다. 그것들도 삭제하려면 -d
를 -D
변경하십시오.
dlsso이미 16개의 답이 있는 질문에는 보통 답을 하지 않겠지만 다른 답은 모두 틀리고 정답은 너무 간단합니다. 질문은 "원격에 상응하는 것이 더 이상 존재하지 않는 모든 추적 분기를 삭제하는 간단한 방법이 있습니까?"라고 말합니다.
"단순"이 모든 독자가 가지고 있지 않은 도구에 의존하지 않고 취약하지 않고 위험하지 않고 한 번에 모두 삭제하는 것을 의미한다면 올바른 대답은 아니오입니다.
일부 답변은 간단하지만 요청한 대로 수행하지 않습니다. 다른 사람들은 요청한 대로 수행하지만 간단하지 않습니다. 모두 텍스트 조작 명령이나 스크립팅 언어를 통해 Git 출력을 구문 분석하는 데 의존하며, 이는 모든 시스템에 존재하지 않을 수 있습니다. 게다가 대부분의 제안은 출력이 스크립트에 의해 구문 분석되도록 설계되지 않은 도자기 명령을 사용합니다("도자기"는 인간 작업을 위한 명령을 나타내며 스크립트는 하위 수준의 "배관" 명령을 사용해야 함).
추가 읽기:
이 작업을 안전하게 수행하려면 질문의 사용 사례(서버에서 삭제되었지만 여전히 로컬 분기로 존재하는 가비지 수집 추적 분기)와 고급 Git 명령만 사용하는 경우 다음을 수행해야 합니다.
-
git fetch --prune
(또는 별칭인 git fetch -p
git prune remote origin
, 아마도 대부분의 경우 원하는 것이 아닐 수도 있음). - 삭제된 것으로 보고된 원격 분기를 기록해 두십시오. 또는 나중에 찾으려면
git branch -v
(고아 추적 분기는 "[gone]"으로 표시됨). - 각 고아 추적 분기의
git branch -d [branch_name]
(이것은 다른 답변 중 일부가 제안한 것입니다).
솔루션을 스크립팅하려면 Mark Longair의 답변 here 및 this answer to another question for-each-ref
가 시작점이지만 쉘 스크립트 루프를 작성하지 않고는 이를 악용할 방법이 없습니다. 또는 xargs 등을 사용합니다.
배경 설명
무슨 일이 일어나고 있는지 이해하려면 분기를 추적하는 상황에서 분기가 하나가 아니라 세 개라는 사실을 알아야 합니다. (그리고 "분기"는 단순히 커밋에 대한 포인터를 의미한다는 것을 기억하십시오.)
추적 분기 feature/X
주어지면 원격 저장소(서버)에 이 분기가 있고 이를 feature/X
라고 합니다. 로컬 리포지토리에는 remotes/origin/feature/X
분기가 있습니다. 즉, "이것은 우리가 지난번에 이야기한 기능/X 분기가 원격에서 알려준 것입니다." 그리고 마지막으로 로컬 리포지토리에는 분기 feature/X
가 있습니다. remotes/origin/feature/X
"추적"하도록 구성되어 정렬을 유지하기 위해 당기고 밀어넣을 수 있습니다.
어떤 시점에서 누군가가 리모컨 feature/X
그 순간부터 로컬 feature/X
(기능 X에 대한 작업이 아마도 끝났을 것이므로 더 이상 원하지 않을 것입니다)와 remotes/origin/feature/X
만 남게 되므로 확실히 쓸모가 없습니다. 목적은 서버 분기의 상태를 기억하는 것이었습니다.
그리고 Git을 사용하면 중복된 remotes/origin/feature/X
를 자동으로 정리할 수 있습니다. 이것이 바로 git fetch --prune
이 하는 일입니다. 그러나 어떤 이유로 사용자 고유의 feature/X
를 자동으로 삭제할 수는 없습니다. feature/X
여전히 분리된 추적 정보가 포함되어 있으므로 완전히 병합된 이전 추적 분기를 식별하는 정보가 있습니다. (결국, 그것은 당신에게 당신이 손으로 직접 작업을 수행 할 수있는 정보를 제공 할 수 있습니다.)
Andrew Spencer윈도우 솔루션
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().Trim().Split(" ")[0]}
분기 이름 가져오기
% {git branch -d $_}
는 분기를 삭제합니다.
chris31389여기에서 답을 찾았습니다. 병합된 모든 git 분기를 어떻게 삭제할 수 있습니까?
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
우리가 주인을 지키는지 확인하십시오
첫 번째 grep
master
또는 해당 문제에 대한 다른 분기가 제거되지 않도록 할 수 있습니다. 이 경우 당신은 갈 것입니다 :
git branch --merged | grep -v "\*" | grep -v "YOUR_BRANCH_TO_KEEP" | xargs -n 1 git branch -d
master
, develop
및 staging
을 유지하려면 다음을 수행합니다.
git branch --merged | grep -v "\*" | grep -v "master" | grep -v "develop" | grep -v "staging" | xargs -n 1 git branch -d
이것을 별칭으로 지정
.zshrc
또는 .bashrc
별칭을 추가할 수 있습니다. 광산은 gbpurge
라고합니다 ( git branches purge
).
alias gbpurge='git branch --merged | grep -v "\*" | grep -v "master" | grep -v "develop" | grep -v "staging" | xargs -n 1 git branch -d'
.bashrc
또는 .zshrc
다시 로드합니다.
. ~/.bashrc
또는
. ~/.zshrc
karlingen대부분의 다른 솔루션의 "사라짐"에 대한 패턴 일치는 저에게 약간 무서웠습니다. 더 안전하게 하기 위해 --format
플래그를 사용하여 각 분기의 업스트림 추적 상태 를 가져옵니다.
Windows 친화적 인 버전이 필요했기 때문에 Powershell을 사용하여 "사라짐"으로 나열된 모든 분기가 삭제됩니다.
git branch --list --format "%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)" | ? { $_ -ne "" } | % { git branch -D $_ }
첫 번째 줄은 업스트림 분기가 "사라진" 로컬 분기의 이름을 나열합니다. 다음 줄은 빈 줄("사라지지 않은" 분기에 대한 출력)을 제거한 다음 분기 이름을 명령에 전달하여 분기를 삭제합니다.
Patrick Quirk마스터에 병합된 모든 분기를 제거하지만 마스터 자체를 제거하려고 하지 마십시오.
git checkout master && git pull origin master && git fetch -p && git branch -d $(git branch --merged | grep master -v)
또는 별칭 추가:
alias gitcleanlocal="git checkout master && git pull origin master && git fetch -p && git branch -d $(git branch --merged | grep master -v)"
설명:
git checkout master
체크아웃 마스터 브랜치
git pull origin master
는 로컬 브랜치가 모든 원격 변경 사항을 병합했는지 확인합니다.
git fetch -p
삭제된 원격 분기에 대한 참조 제거
git branch -d $(git branch master --merged | grep master -v)
에 병합된 모든 분기를 삭제하지만 마스터 자체를 제거하려고 시도하지 마십시오.
cs01당신은 이것을 할 수 있습니다:
git branch -vv | grep 'origin/.*: gone]' | awk '{print $1}' | xargs git branch -d
추신: Sam H.
이것을 먼저 실행하십시오:
git remote prune origin
Sven DhaensTL;DR:
원격에 있지 않은 모든 로컬 분기 제거
git fetch -p && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -D
원격에 있지 않고 완전히 병합되고 이전에 많은 답변에서 말했듯이 사용되지 않은 모든 로컬 분기를 제거하십시오.
git fetch -p && git branch --merged | grep -v '*' | grep -v 'master' | xargs git branch -d
설명
-
git fetch -p
는 더 이상 원격에 존재하지 않는 모든 분기를 정리합니다. -
git branch -vv
는 로컬 브랜치를 출력하고 가지치기된 브랜치는 gone
-
grep ': gone]'
브랜치만 선택 -
awk '{print $1}'
출력을 필터링하여 분기 이름만 표시합니다. -
xargs git branch -D
는 모든 줄(가지)을 반복하고 이 분기를 강제로 제거합니다.
git branch -D
가 아닌 git branch -d
이유는 완전히 병합되지 않은 분기에 대한 것입니다.
error: The branch 'xxx' is not fully merged.
norajgit fetch -p
이렇게 하면 더 이상 원격지에 존재하지 않는 모든 가지 가 정리됩니다.
ckirksey3또 다른 대답은 우아함과 플랫폼 간 요구에 맞는 솔루션이 없기 때문입니다.
원격에 있지 않은 로컬 분기를 삭제하는 명령:
for b in $(git for-each-ref --format='%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)' refs/heads); do git branch -d $b; done
git branch-prune
으로 실행할 수 있도록 gitconfig와 통합하려면 다음을 수행합니다.
세게 때리다
git config --global alias.branch-prune '!git fetch -p && for b in $(git for-each-ref --format='\''%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)'\'' refs/heads); do git branch -d $b; done'
파워쉘
git config --global alias.branch-prune '!git fetch -p && for b in $(git for-each-ref --format=''%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)'' refs/heads); do git branch -d $b; done'
(PowerShell 및 bash용 범용 명령을 찾는 데 도움이 필요함)
이 답변이 가장 좋은 이유는 무엇입니까?
- 완전한 솔루션 제공:
git branch-prune
명령을 git에 추가 - Windows PowerShell에서 제대로 작동
- 핵심 아이디어는
git for-each-ref
사용하는 @jason.rickman 의 방탄 방법입니다. - 구문 분석 및 필터링은
--filter
하여 수행되므로 외부 종속성이 필요하지 않습니다.
설명:
-
~\.gitconfig
새 별칭을 추가합니다. 이것을 실행한 후 간단히 git branch-prune
- 이 별칭 내부:
- --prune 플래그가 있는 가지를 가져
--prune
플래그는 "더 이상 원격에 있지 않은 원격 추적 분기를 정리합니다" -
git for-each-ref
및 --filter
를 사용하여 분기 목록을 가져옵니다. [gone]
(원격 없음) - 이 목록을 반복하고 분기를 안전하게 삭제합니다.
Himura패트릭의 답변 gone]
졌는지에 대한 모호성을 없애는 것처럼 보이기 때문에 내가 git branch
출력과 일치하지만 *nix 구부러진 부분을 추가하는 더미에 대한 또 다른 답변입니다.
가장 간단한 형태:
git branch --list --format \ "%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)" \ | xargs git branch -D
내 경로 git-gone
스크립트에 이것을 래핑했습니다.
#!/usr/bin/env bash action() { ${DELETE} && xargs git branch -D || cat } get_gone() { git branch --list --format \ "%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)" } main() { DELETE=false while [ $# -gt 0 ] ; do case "${1}" in (-[dD] | --delete) DELETE=true ;; esac shift done get_gone | action } main "${@}"
주의 - --format
옵션은 상당히 새로운 것 같습니다. 그것을 얻으려면 2.10.something에서 2.16.3으로 git을 업그레이드해야했습니다.
편집: Benjamin W의 refname:short
에 대한 제안을 포함하도록 조정되었습니다.
NB2 - 나는 bash
에서만 테스트 했으므로 hashbang 이지만 아마도 sh
이식 가능합니다.
bxm이렇게 하면 로컬 마스터 참조와 현재 사용 중인 참조를 제외한 모든 병합된 로컬 분기가 삭제됩니다.
git branch --merged | grep -v "*" | grep -v "master" | xargs git branch -d
그리고 이것은 " origin "이 참조하는 원격 저장소에서 이미 제거된 모든 분기를 삭제 하지만 " remote/origin "에서 여전히 로컬로 사용할 수 있습니다.
git remote prune origin
pabloa98마스터 및 개발을 제외한 모든 로컬 분기를 지우는 간단한 한 줄에 유용할 수 있습니다.
git branch | grep -v "master" | grep -v "develop" | xargs git branch -D
Francois이 작업을 수행하는 기본 제공 명령이 없다고 생각하지만 다음을 수행하는 것이 안전합니다.
git checkout master git branch -d bug-fix-a
-d
를 사용하면 HEAD
또는 업스트림 원격 추적 분기에 완전히 병합되지 않는 한 분기 삭제를 거부합니다. git for-each-ref
의 출력을 반복하고 각 분기를 삭제하려고 할 수 있습니다. 이 접근 방식의 문제는 당신이 아마하지 않을 것으로 생각한다는 것입니다 bug-fix-d
이유만으로 삭제 될 origin/bug-fix-d
그 역사를 포함한다. 대신 다음과 같은 스크립트를 만들 수 있습니다.
#!/bin/sh git checkout master && for r in $(git for-each-ref refs/heads --format='%(refname:short)') do if [ x$(git merge-base master "$r") = x$(git rev-parse --verify "$r") ] then if [ "$r" != "master" ] then git branch -d "$r" fi fi done
경고: 이 스크립트를 테스트하지 않았습니다. 주의해서 사용하십시오...
Mark Longairgrep gone <(git branch -v) | cut -d ' ' -f 3 | xargs git branch -d
위의 명령은 원격에서 병합 및 삭제된 분기를 가져오는 데 사용할 수 있으며 더 이상 원격에서 사용할 수 없는 로컬 분기를 삭제합니다.
thiruclassic이 중 어느 것도 나에게 정말 옳지 않았습니다. 나는 원격 분기가 삭제된( gone
) origin
에서 원격 분기를 추적하는 모든 로컬 분기를 제거할 무언가를 원했습니다. 원격 분기를 추적하도록 설정되지 않은 로컬 분기(예: 내 로컬 개발 분기)를 삭제하고 싶지 않았습니다. 또한 사용자 지정 스크립트를 작성하는 대신 git
또는 기타 간단한 CLI 도구를 사용하는 간단한 한 줄짜리를 원했습니다. 이 간단한 명령을 만들기 위해 약간의 grep
과 awk
이것은 궁극적으로 내 ~/.gitconfig
에서 끝난 것입니다.
[alias] prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -D
다음은 git prune-branches
로 쉽게 추가하기 위한 git config --global ...
명령입니다.
git config --global alias.prune-branches '!git remote prune origin && git branch -vv | grep '"'"': gone]'"'"' | awk '"'"'{print $1}'"'"' | xargs -r git branch -d'
참고: config 명령에서 실제 구성에서와 같이 -D
대신 git branch
-d
옵션을 사용합니다. Git이 병합되지 않은 분기에 대해 불평하는 것을 듣고 싶지 않기 때문에 -D
사용합니다. 이 기능을 원할 수도 있습니다. 그렇다면 해당 구성 명령의 끝에서 -d
대신 -D
를 사용하기만 하면 됩니다.
Karl Wilbur여기의 많은 구현보다 더 읽기 쉬운 Powershell 기반 솔루션입니다.
# prune deleted remoted branches git fetch -p # get all branches and their corresponding remote status # deleted remotes will be marked [gone] git branch -v | #find ones marked [gone], capture branchName select-string -Pattern '^ (?<branchName>\S+)\s+\w+ \[gone\]' | foreach-object{ #delete the captured branchname. git branch -D $_.Matches[0].Groups['branchName'] }
Pxtl위의 정보를 바탕으로 이것은 저에게 효과적이었습니다.
git br -d `git br -vv | grep ': gone] ' | awk '{print $1}' | xargs`
원격에서 ': gone] '
이 있는 모든 로컬 분기를 제거합니다.
Joost den BoerA로부터 크게 그리기 수 의 다른 답변 여기에 어떤 작업을해야하는, 내가 다음에 결국 한 (자식 2.13 이상 만 저는 믿습니다) UNIX와 같은 쉘 :
git for-each-ref --shell --format='ref=%(if:equals=[gone])%(upstream:track)%(then)%(refname)%(end)' refs/heads | while read entry; do eval "$entry"; [ ! -z "$ref" ] && git update-ref -d "$ref" && echo "deleted $ref"; done
이것은 특히 branch
for-each-ref
사용하고( branch
는 기계 처리가 아닌 사람이 읽을 수 있는 출력을 위해 설계된 "자기" 명령이므로) --shell
인수를 사용하여 적절하게 이스케이프된 출력을 얻습니다(이렇게 하면 ref 이름의 모든 문자에 대해 걱정하십시오).
gsnedders위의 답변은 분기를 수동으로 정리하는 방법을 다루지만 이 답변은 이를 해결하기 위해 자동화를 추가합니다. git
에는 모든 가져오기 작업에 대해 더 이상 원격에 없는 오래된 분기를 정리하는 새로운 설정이 있습니다. 분기를 삭제할 때마다 remote prune
을 더 이상 수동으로 호출할 필요가 없기 때문에 이것은 훌륭합니다 git pull
git fetch
도 호출함).
모든 가져오기에 대해 정리 동작 활성화
전역 구성에서 이것을 활성화하려면:
git config --global fetch.prune true
일이 자동으로 이루어지도록 하면 새 컴퓨터에 이 설정을 추가하는 것을 잊어버릴 수 있습니다. 그냥 작동합니다.
특정 리모컨의 모든 가져오기에 대해 정리 동작 활성화
git config --global remote.<name>.prune true
로컬 자동 가지치기
--global
플래그 없이 로컬 가지치기에도 동일한 명령을 적용할 수 있습니다.
.gitconfig
위의 명령은 다음과 같이 .gitconfig
... [fetch] prune = true
향후 설정을 자동화하기 위해 이것을 가능한 구성이나 dotfiles 저장소( .gitconfig
구성 설정은 모든 가져오기에서 아래 명령을 호출합니다.
git remote prune <remote name>
요약
실행을 기억할 필요 없이 일반 워크플로의 일부로 참조를 fetch.prune
전역 또는 remote.<name>.prune
per-remote로 설정하십시오. git-config 를 참조하십시오.
Pranav KasettiGit Tip: Deleting Old Local Branches 를 기반으로 하며 이는 jason.rickman의 솔루션 과 유사합니다. 이 목적을 위해 Bash를 사용하여 git gone 이라는 사용자 지정 명령을 구현했습니다.
$ git gone usage: git gone [-pndD] [<branch>=origin] OPTIONS -p prune remote branch -n dry run: list the gone branches -d delete the gone branches -D delete the gone branches forcefully EXAMPLES git gone -pn prune and dry run git gone -d delete the gone branches
git gone -pn
은 가지 치기와 "사라진"가지 나열을 결합합니다.
$ git gone -pn bport/fix-server-broadcast b472d5d2b [origin/bport/fix-server-broadcast: gone] Bump modules fport/rangepos 45c857d15 [origin/fport/rangepos: gone] Bump modules
git gone -d
또는 git gone -D
사용하여 방아쇠를 당길 수 있습니다.
노트
- 내가 사용한 정규식은
"$BRANCH/.*: gone]"
이며, 여기서 $BRANCH
는 일반적으로 origin
입니다. Git 출력이 프랑스어 등으로 현지화되면 작동하지 않을 수 있습니다. - Sebastian Wiesner도 Windows 사용자를 위해 Rust로 이식했습니다. git gone 이라고도 합니다.
Eugene Yokota이 명령이 원하는 것일 수 있습니다.
실행 후:
git remote prune origin
그런 다음 실행:
diff <(git branch | sed -e 's/*/ /g') <(git branch -r | sed -e 's/origin\///g') | grep '^<'
이것은 (git branch -r)이 아니라 (git branch)에 있는 모든 분기를 표시합니다.
이 방법에는 문제가 있습니다. 이전에 푸시하지 않은 분기도 로컬에 표시됩니다.
LaobeWindows 또는 명령줄 스크립팅을 원하지 않거나 할 수 없거나 PowerShell을 사용하고 싶지 않은 사용자를 위한 더 간단한 솔루션입니다.
분기 목록을 파일에 덤프합니다. git branch > branches.txt
(또는 git branch --merged > branches.txt
, 벨트 및 멜빵 유형인 경우 git branch -d
병합되지 않은 분기 삭제를 방지합니다)
편집기에서 해당 파일을 열고 모든 행을 결합합니다(저는 숭고한 텍스트를 사용했으므로 모두 강조 표시하고 ctrl+j
누릅니다).
분기 목록 앞에 git branch -d
추가하십시오.
모두 선택하고 복사하여 명령줄에 붙여넣습니다(Windows cmd 창에서 마우스 오른쪽 버튼 클릭).
Tom Pietrosanti명령을 더 쉽게 읽을 수 있도록 파이프를 사용하는 것을 좋아합니다.
마스터를 제외한 모든 분기를 제거하려는 경우 이것이 내 솔루션입니다.
git branch | grep -v master | xargs -n 1 git branch -D
기준과 일치하는 다른 분기를 삭제하려면 첫 번째 및 두 번째 블록을 수정하십시오.
git branch --merged | grep feature_name | xargs -n 1 git branch -D
espaciomore진짜 문제는 관리자가 커밋을 스쿼시할 때입니다. --merged
와 같은 git 내장 기능을 사용하는 솔루션은 도움이 되지 않습니다.
git-delete-merged-branches 도구를 사용하면 편리한 분기 삭제가 가능합니다. 특히 대화형 모드가 마음에 듭니다.
설치( python3
필요):
pip install git-delete-merged-branches
그런 다음 실행
git-delete-merged-branches --effort=3
--effort=3
은 찌그러진 가지를 삭제하는 데 중요합니다.
대안
koppor이 bash 스크립트를 생각해 냈습니다. 그것 은 항상 분기 를 develop
, qa
, master
유지 합니다 .
git-clear() { git pull -a > /dev/null local branches=$(git branch --merged | grep -v 'develop' | grep -v 'master' | grep -v 'qa' | sed 's/^\s*//') branches=(${branches//;/ }) if [ -z $branches ]; then echo 'No branches to delete...' return; fi echo $branches echo 'Do you want to delete these merged branches? (y/n)' read yn case $yn in [^Yy]* ) return;; esac echo 'Deleting...' git remote prune origin echo $branches | xargs git branch -d git branch -vv }
BrunoLM나는 트릭을 수행하기 위해 짧은 방법을 사용합니다. 몇 시간을 절약하고 더 많은 가시성을 제공할 수 있으므로 동일한 방법을 사용하는 것이 좋습니다.
다음 스니펫을 .bashrc(macos의 경우 .bashprofile)에 추가하기만 하면 됩니다.
git-cleaner() { git fetch --all --prune && git branch --merged | grep -v -E "\bmaster|preprod|dmz\b" | xargs -n 1 git branch -d ;};
- 모든 리모컨 가져오기
- git에서 병합된 분기만 가져오기
- 이 목록에서 "보호/중요" 분기 제거
- 나머지 제거(예: 정리 및 병합된 분기)
필요에 맞게 grep regex를 편집해야 합니다(여기서 master, preprod 및 dmz가 삭제되는 것을 방지합니다).
benftwc이것은 나를 위해 일했습니다.
git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d
Fareed Alnamrouti출처 : http:www.stackoverflow.com/questions/7726949/remove-tracking-branches-no-longer-on-remote