programing

모든 로컬 git 분기 삭제

oldcodes 2023. 4. 9. 22:21
반응형

모든 로컬 git 분기 삭제

저는 새로운 기능이나 스토리 카드마다 새로운 로컬 지점을 만드는 개발 프로세스를 따릅니다.완료되면 브런치를 마스터로 통합한 후 푸시합니다.

게으름과 건망증이 겹치면서 시간이 지남에 따라 발생하는 경향이 있는 것은 결국 많은 지역 지사 목록이 생기게 되는데, 그 중 일부 지점(예: 스파이크 지점)은 합병되지 않았을 수 있습니다.

로컬 브랜치를 모두 나열하는 방법과 하나의 브랜치를 삭제하는 방법을 알고 있는데, 로컬 브랜치를 모두 삭제할 수 있는 git 명령어가 있는지 궁금합니다.

은 음음음음 below below below의 of of of of of of of of of of 의 결과입니다.git branch --merged명령어를 입력합니다.

user@machine:~/projects/application[master]$ git branch --merged
  STORY-123-Short-Description
  STORY-456-Another-Description
  STORY-789-Blah-Blah
* master

하려고 합니다.grep -v \*) 에러가

error: branch 'STORY-123-Short-Description' not found.
error: branch 'STORY-456-Another-Description' not found.
error: branch 'STORY-789-Blah-Blah' not found.

사용하고 있는 것:

git 1.7.4.1  
ubuntu 10.04  
GNU bash, version 4.1.5(1)-release  
GNU grep 2.5.4  

'git branch -d' 하위 명령은 두 개 이상의 분기를 삭제할 수 있습니다.따라서 @sblom의 답변을 단순화하지만 중요한 xargs를 추가합니다.

git branch -D `git branch --merged | grep -v \* | xargs`

또는, 한층 더 심플화:

git branch --merged | grep -v \* | xargs git branch -D 

중요한 은 @AndrewC에서 설명한 바와 같이git branch스크립트 작성은 권장되지 않습니다.이를 방지하려면 다음과 같은 방법을 사용합니다.

git for-each-ref --format '%(refname:short)' refs/heads | grep -v "master\|main" | xargs git branch -D

삭제 시 주의가 필요합니다!

$ mkdir br
$ cd br; git init
Initialized empty Git repository in /Users/ebg/test/br/.git/
$ touch README; git add README; git commit -m 'First commit'
[master (root-commit) 1d738b5] First commit
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README
$ git branch Story-123-a
$ git branch Story-123-b
$ git branch Story-123-c
$ git branch --merged
  Story-123-a
  Story-123-b
  Story-123-c
* master
$ git branch --merged | grep -v \* | xargs
Story-123-a Story-123-b Story-123-c
$ git branch --merged | grep -v \* | xargs git branch -D
Deleted branch Story-123-a (was 1d738b5).
Deleted branch Story-123-b (was 1d738b5).
Deleted branch Story-123-c (was 1d738b5).

모든 브랜치를 삭제하되 "develope" 및 "master"와 같은 브랜치를 유지하는 보다 간단한 방법은 다음과 같습니다.

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

매우 유용하다!

나는 github의 이 문제에 대한 코멘트에서 더 좋은 방법을 찾았다.

git branch --merged master --no-color | grep -v "master\|stable\|main" | xargs git branch -d

편집: 무색 옵션 추가 및 안정적인 브랜치 제외 (필요에 따라 다른 브랜치 추가)

「 」의 출력 git branch을 사용하다스택 오버플로우에서 향후 독자들에게는 좋은 답변이 아닙니다.

  1. git branch' 명령어라고 알려져 .자기 명령어'라고 알려져 있습니다.자기 명령은 기계 구문 분석용으로 설계되지 않았으며 Git의 다른 버전 간에 출력이 변경될 수 있습니다.
  2. 에서는, 「」의 할 수 .git branch해석하기 어려운 방법(예를 들어, 색채화)입니다.가 '하다'를 color.branch 코드가 .★★★★★★★★★★★★★★★★,error: branch 'foo' not found.다른 명령어에 연결하려고 할 경우.를 사용하면, 할 수 .--no-color을 들다git branch하지만, 그 외의 유저 설정에서는 문제가 발생할 가능성이 있습니다.
  3. git branch는, 체크 아웃 있는 옆에 해석하기 다른 할 수 .

git의 maintainer는 스크립트 작성에 대해 이렇게 말합니다.git branch

현재의 브랜치를 알아내기 위해 캐주얼/경솔한 사용자는 git 브랜치를 중심으로 스크립트를 작성했을 수 있습니다.이것은 잘못된 것입니다.git branch를 포함한 Poshis 명령어를 스크립트에서 사용하는 것은 적극적으로 권장하지 않습니다.명령어 출력은 인간의 사용 사례에 도움이 되도록 변경될 수 있기 때문입니다.

「」의 을 수동으로 하는 것을 ..git디렉토리(.git/refs/heads 등)도 마찬가지로 문제가 있습니다(refs는 대신 .git/packed-refs에 있거나 Git은 나중에 내부 레이아웃을 변경할 수 있습니다).

은 Git을 합니다.for-each-ref명령어를 사용하여 브랜치 목록을 가져옵니다.

2는 Git 2.7을 이다.X자--merged된 모든 을 찾아 할 수 .HEAD

for mergedBranch in $(git for-each-ref --format '%(refname:short)' --merged HEAD refs/heads/)
do
    git branch -d ${mergedBranch}
done

Git 2.6.X 이전 버전에서는 로컬 브랜치를 모두 나열한 후 개별적으로 테스트하여 통합 여부를 확인해야 합니다(이는 상당히 느리고 약간 복잡해집니다).

for branch in $(git for-each-ref --format '%(refname:short)' refs/heads/)
do
    git merge-base --is-ancestor ${branch} HEAD && git branch -d ${branch}
done

다음 셸 명령을 사용해 보십시오.

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

설명:

  • 제외)를 '마스터' 경유로 합니다.git branch | grep -v "master"
  • 를 모두 합니다.xargs
  • 삭제(「」(「」)로 합니다.xargs git branch -D

다음 명령어는 마스터 브랜치를 제외한 모든 로컬브런치를 삭제합니다.

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

위의 명령어

  1. 모든 지점을 나열하다
  2. 목록에서 마스터 브랜치를 무시하고 나머지 브랜치를 가져옵니다.
  3. 브랜치를 삭제하다

현재 체크아웃한 브런치를 제외한 모든 브런치를 삭제하려면 다음 절차를 수행합니다.

for b in `git branch --merged | grep -v \*`; do git branch -D $b; done

것을 .git branch -D $b echo $b처음 몇 번을 사용하여 의도한 분기가 삭제되었는지 확인합니다.

현재 지점을 제외한 리눅스의 모든 로컬 지점을 삭제하려면 다음과 같이 하십시오.

// hard delete

git branch -D $(git branch)

710 1 . 7 . 10 1 1 。현재 버전에서는 작동하지 않는 답변을 얻을 수 있습니다.에는 '보다'를 붙여야 할 것 같아요.refs/heads/.

주의: 작업 폴더와 .git 디렉토리를 복사한 경우에만 다음 절차를 진행하십시오.

는 가끔 않는 ..git/refs/heads이들 브랜치는 모두 그들이 가리키는 커밋의 40글자 sha-1을 포함하는 텍스트파일입니다.의 ' 정보'에는 이와 ..git/config특정 추적을 설정했는지 확인합니다.이러한 엔트리는 수동으로 삭제할 수도 있습니다.

텍스트 에디터와 셸만 사용하는 것이 더 편하다는 것을 알았습니다.

  1. 「」라고 입력합니다.git checkout <TAB>브랜치를 모두 합니다.모든 로컬 분기를 표시합니다.
  2. 텍스트 편집기에 복사하고 보관해야 할 내용을 제거합니다.
  3. 줄 바꿈을 공백으로 바꿉니다.(숭고함)텍스트는 매우 간단합니다.)
  4. " " " , " 라고 입력합니다.git branch -D <PASTE THE BRANCHES NAMES HERE>.

바로 그겁니다.

Windows 명령줄에서 다음 명령을 사용하여 현재 체크아웃된 분기를 제외한 모든 항목을 삭제합니다.

for /f "tokens=*" %f in ('git branch ^| find /v "*"') do git branch -D %f

로컬 브런치를 모두 삭제하려면 다음 명령을 사용합니다.

git branch -D `git branch`

참고: 현재 체크아웃된 분기를 제외한 모든 분기가 삭제됩니다.

저도 비슷한 상황이 있었는데, 최근에 다음 명령어가 도움이 되었습니다.

git branch -D `git branch | awk '{ if ($0 !~ /<Branch_You_Want_to_Keep>/) printf "%s", $0 }'`

여러 지점을 유지하려면

git branch -D `git branch | awk '{ if ($0 !~ /<Branch_You_Want_to_Keep1>|<Branch_You_Want_to_Keep2>/) printf "%s", $0 }'`

이게 도움이 됐으면 좋겠어요

Windows 머신 상에서 가동하고 있는 사용자를 위한 Powershell 솔루션

git checkout master # by being on the master branch, you won't be able to delete it
foreach($branch in (git branch))
{
    git branch -D $branch.Trim()
}

로컬 git 브랜치를 모두 제거하고 메인 상태를 유지하려면

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

첫 번째 (> ex: 마스터를 유지하는 브랜치로 전환):

git checkout master

second(마스터에 있는지 확인)

git branch -D $(git branch)

PowerShell을 사용하는 경우

git branch -D $(git branch).Trim()

NodeJS를 사용하는 경우 다음 명령을 작성했습니다.

npx git-clear-branch

이 명령어는 마스터 브랜치와 현재 브랜치를 제외한 모든 로컬브런치를 클리어합니다.

git branch -l |grep -v master | xargs git branch -D

그러나 브랜치를 삭제해도 상관없습니다.워크스페이스를 삭제하고 작은 저장소라면 다시 복제해 주세요!!

명령줄 솔루션은 아니지만 Git GUI가 아직 제안되지 않은 것이 놀랍습니다.

커맨드 라인을 99% 사용하고 있습니다만, 이 경우는 속도가 느려지거나(즉, 원래의 질문), 장황하지만 교묘한 셸 조작에 의지했을 때에 무엇을 삭제하려고 하는지 알 수 없습니다.

각 브랜치에 명령어를 입력할 필요 없이 삭제할 브랜치를 빠르게 체크 아웃하고 유지할 브랜치를 상기시킬 수 있기 때문에 UI는 이 문제를 해결합니다.

UI에서 Branch --> Delete이동하고 Ctrl+삭제할 브런치를 클릭하여 강조 표시합니다.브런치(예: 브런치)로 통합되는 것을 확인하는 경우dev[ Delete Only if Mergeed Into ]에서 [Local Branch]를 설정합니다.dev그렇지 않으면 이 체크를 무시하려면 항상으로 설정합니다.

GitUI: 로컬 브랜치 삭제

Git 자체를 사용할 필요가 없다면 .git/refs/heads 아래의 헤드를 수동으로 또는 프로그래밍 방식으로 삭제할 수도 있습니다.다음은 Bash에서 최소한의 조정으로 작동합니다.

shopt -s extglob
rm -rf .git/refs/heads/!(master)

마스터 브랜치를 제외한 모든 로컬 브랜치가 삭제됩니다.업스트림브런치는 .git/refs/remotes 아래에 저장되므로 변경되지 않습니다.

Bash를 사용하지 않거나 많은 Git 저장소를 한 번에 다시 찾고 싶다면 GNU에서 비슷한 작업을 수행할 수 있습니다.

find . \
    -path remotes -path logs -prune -o \
    -wholename \*.git/refs/heads/\* \! -name master -print0 |
xargs -0 rm -rf

검색 솔루션이 더 휴대성이 높지만 경로와 파일 이름을 삭제하는 것은 까다롭고 오류가 발생하기 쉽습니다.

어떤 답변도 제 요구를 완전히 충족시키지 못했습니다.그러면 다음과 같이 하겠습니다.

git branch --merged | grep -E "(feature|bugfix|hotfix)/" | xargs git branch -D && git remote prune origin

가 모두 삭제됩니다.feature/,bugfix/ ★★★★★★★★★★★★★★★★★」hotfix/ 후 " " " origin는 플루닝 됩니다(패스워드를 입력해야 할 수 있습니다).

Git 1.9.5에서 동작합니다.

여기에 있는 여러 응답 조합에 따라 - 원격에 있는 모든 분기를 유지하고 나머지 분기를 삭제하려는 경우 다음 오닐라이너가 문제를 해결합니다.

git for-each-ref --format '%(refname:short)' refs/heads | grep -Ev `git ls-remote --quiet --heads origin | awk '{print substr($2, 12)}'| paste -sd "|" -` | xargs git branch -D

마스터를 유지하려면 및 모든 원격 지점을 개발하십시오.Github에 존재하지 않는 모든 로컬브런치를 삭제합니다.

$ git fetch --prune

$ git branch | grep -v "origin" | grep -v "develop" | grep -v "master" | xargs git branch -D

1] 리모트 저장소에서 사용되지 않게 된 리모트 참조가 삭제됩니다.

2] 모든 브랜치의 리스트가 표시됩니다.master, develope 또는 origin(원격 브랜치)목록의 모든 분기를 삭제합니다.

경고 - 자체 로컬 지점도 삭제됩니다.따라서 브런치를 Marge하고 Marge, Delete 후 정리를 수행할 때 이 작업을 수행합니다.

git branch -d [branch name]

git branch -D [branch name]할 수 있지만 으로 사용할 수 있습니다.

여러 로컬 브랜치를 한 번에 삭제하는 중

# delete all local unmerged branches
git branch --no-merged | egrep -v "(^\*|master|dev)" | xargs git branch -D
# delete all local branches (merged and unmerged).
git branch | egrep -v "(^\*|master|dev)" | xargs git branch -D  

원격 분기 삭제 중

# Deleting non-existent tracking branches
git remote prune <remote> --dry-run
# Deleting a single remote branch
git push <remote> --delete <branch>
# Deleting many remote branches at once
git branch -r --merged | egrep -v "(^\*|master|dev)" | sed 's/origin\///' | xargs -n 1 git push origin --delete

원천

powershell의 경우 다음과 같이 동작합니다.

git branch --format '%(refname:lstrip=2)' --merged `
    | Where-Object { $_ -ne 'master' } `
    | ForEach-Object { git branch -d $_ }

GREP나 다른 UNIX는 가지고 있지 않지만 VSCode 터미널에서 작동했습니다.

git branch -d $(git branch).trim()

병합되지 않은 브랜치는 삭제되지 않도록 소문자 d를 사용합니다.

나도 그때 마스터였으니까* master존재하지 않기 때문에 마스터 삭제는 시도하지 않았습니다.

좀 더 온건한 답변을 추천합니다.은 '아예'를 사용하고 있습니다.-D변경 내용이 Marge되었는지 여부에 관계없이 강제로 삭제됩니다.이 라이너에는 잔해가 없는 나뭇가지를 건드리지 않는 것이 있습니다.

git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d

여기에 있는 다른 해 보고 .-D로로 합니다.-d의 경우하는 것이 -d.

git branch | grep release-1.4 | xargs -n 1 -I % sh -c 'git branch -D %'

'release-1.4*' 패턴과 일치하는 이름의 브랜치를 모두 쉽게 삭제할 수 있습니다.또한 정기적으로 티켓 접두사와 함께 사용하여 로컬 영업 지점을 모두 삭제합니다. 단, 파이프라인 브랜치는 연결되지 않은 상태로 둡니다.

이를 위해 git-extra를 사용할 수 있습니다.

$ git delete-merged-branches
Deleted feature/themes (was c029ab3).
Deleted feature/live_preview (was a81b002).
Deleted feature/dashboard (was 923befa).

언급URL : https://stackoverflow.com/questions/10610327/delete-all-local-git-branches

반응형