itsource

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

mycopycode 2023. 6. 1. 22:44
반응형

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

오래된 지점이 많이 있는 로컬 저장소를 정리하고 싶습니다. 예를 들어,3.2,3.2.1,3.2.2 타기.

저는 한 번에 많은 양을 제거할 수 있는 교활한 방법을 기대하고 있었습니다.그들은 대부분 도트 릴리스 규칙을 따르기 때문에, 아마도 다음과 같이 말할 수 있는 지름길이 있을 것이라고 생각했습니다.

git branch -D 3.2.*

3.2.x 분기를 모두 제거합니다.

저는 그 명령을 시도했지만, 물론 효과가 없었습니다.

그 구문으로는 안 됩니다.하지만 다음과 같이 할 수 있습니다.

git branch -D 3.2 3.2.1 3.2.2

기본적으로 Git 브랜치는 한 번의 호출로 여러 브랜치를 삭제합니다.안타깝게도 지점 이름이 완성되지 않습니다.bash에서는 다음을 수행할 수 있습니다.

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

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

하나의 라이너 예:

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

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

git branch | grep '3\.2' | xargs git branch -D
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 브랜치 출력이 스크립트에 사용되지 않도록 되어 있습니다.

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\*`

최근, 저는 같은 문제의 해결책을 찾고 있었는데, 마침내 한 가지 답을 찾았고 그것은 매우 잘 작동하고 있습니다.

  1. 터미널 또는 동등한 터미널을 엽니다.
  2. 삭제할 분기의 미리 보기를 위해 git branch | grep "pattern"을 입력합니다.
  3. git 브랜치 입력 | grep "패턴" | xargs git 브랜치 -D

이 솔루션은 훌륭하며 각 명령과 명령의 작동 방식에 대한 자세한 설명이 필요한 경우 여기에 나와 있습니다.

지정된 패턴을 기준으로 여러 분기를 삭제하려면 다음 작업을 수행합니다.

터미널 또는 동등한 터미널을 열고 다음 명령을 입력합니다.

git branch | grep "<pattern>" (preview of the branches based on pattern)

git branch | grep "<pattern>" | xargs git branch -D (replace the <pattern> with a regular expression to match your branch names)

모든 두모제를 합니다.3.2.x를 해야 합니다.

git branch | grep "3.2" | xargs git branch -D

그게 다야!

당신은 가도 좋습니다!

사용하다

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

이것이 유용할 수도 있습니다.

'master', 'foo' 및 'bar'와 같이 'master'가 아닌 모든 분기를 제거하려면

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

grep -v 'something'은 반전이 있는 일치자입니다.

정리를 위해 여러 분기를 삭제하려는 경우 이 작업이 수행됩니다.

 git branch -d branch1 branch2 branch3

또한 삭제 작업을 원격에 반영하려면 이를 사용하여 원본으로 밀어넣을 수 있습니다.

 git push origin --delete branch1 branch2 branch3

다음과 같은 정확한 이유로 지점 이름의 첫 세 글자로 이니셜과 대시(at-)를 넣었습니다.

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

로컬에서 "개발" 상태를 유지하고 다른 모든 항목을 삭제합니다.

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

일반적인 솔루션은 다음과 같습니다.

git branch | grep "<pattern>" | xargs git branch -D

삭제할 분기의 미리 보기를 위해 위의 명령을 실행하기 전에 다음 명령줄을 실행하는 것이 좋습니다.

git branch | grep "<pattern>"

이 경우

git branch | grep "^3\.2\..*" | xargs git branch -D

프롬프트를 git 명령 프롬프트를 할 수 .git gui분기->삭제 메뉴 항목을 사용합니다.삭제할 분기를 모두 선택하고 복사합니다.

사용할 수 있습니다.git gui여러 분기를 한 번에 삭제합니다. 프롬프트> From 명프프트롬/Bash ->git gui-> 원격 -> 지점 삭제... -> 제거할 원격 지점 선택 -> 삭제

만약 당신이 정말로 당신의 모든 가지를 청소해야 한다면, 시도해 보세요.

git branch -d $(git branch)

현재 체크인 중인 지점을 제외한 모든 로컬 병합 지점이 삭제됩니다.

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

Powershell 솔루션:

윈도우즈를 실행하는 경우 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을 합니다. git branch -d $(git branch --list '3.2.*' | %{$_.Trim() })

TL;DR

git branch -D $(git branch | grep '3\.2\..*')

설명.

  1. git branch로컬 시스템의 모든 분기를 나열합니다.
  2. grep '3\.2\..*'하여 현재 .3.2..사용.\탈출하기 위해.grep의 특별한 캐릭터이기 때문에.
  3. git branch | grep '3\.2\..*'모든 github 분기 이름을 grep 명령으로 전달하고 grep 명령은 제공된 목록 내의 문자열로 시작하는 분기 이름을 찾습니다.
  4. $(git branch | grep '3\.2\..*') 모것든된에 것$()는 이 명령을 별도의 셸 명령으로 실행하며, 그 결과를 별도의 명령으로 전달할 수 있습니다.이 경우 발견된 파일 목록을 삭제해야 합니다.
  5. git branch -D $(git branch | grep '3\.2\..*')이것은 위에서 4번 지점에서 설명한 것을 수행할 뿐입니다.

저는 @gawi(위)에서 제공한 답변을 바탕으로 유용할 수 있는 작은 기능을 만들었습니다.

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

을 당신의 에추니다에 하세요..bash_profile터미널을 다시 시작합니다.그런 다음 명령줄에서 다음과 같이 호출할 수 있습니다.

removeBranchesWithPrefix somePrefix

메모

현재 소프트 삭제용으로 설정되어 있습니다. 즉, 분기가 이미 병합되지 않은 경우에는 삭제되지 않습니다.만약 당신이 가장자리에서 사는 것을 좋아한다면, 변화.-d-D그리고 그와 상관없이 접두사가 있는 모든 것을 삭제할 것입니다!

git branch -d branch1 branch2 branch3이미 작동하지만 Git 2.31(2021년 1분기)로 더 빨라질 것입니다.
이전에는 많은 분기와 태그를 제거할 때 코드가 한 번에 하나씩 참조를 수행했습니다.
여러 참조를 삭제하는 데 사용할 수 있는 또 다른 API가 있으며, 참조가 채워지면 성능이 상당히 달라집니다.

phord호드()의 커밋 8198907(2021년 1월 20일)을 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- 2021년 2월 5일 커밋 f6ef8ba에서)

8198907795: 사용delete_refs태그 또는 분기를 삭제할 때

애크리드비: 엘리야 뉴렌
사인 오프 바이: 필 호드

삭제할git tag -d(man) 하나 이상의 태그 참조를 허용하지만 각 삭제는 호출을 통해 수행됩니다.delete_ref각각의 argv.
포장된 참조에서 제거할 때 속도가 매우 느립니다.
사용하다delete_refs한 번의 업데이트로 단일 트랜잭션 내에서 모든 제거를 수행할 수 있습니다.

'git branch -d(man)에 대해서도 마찬가지입니다.

때부터delete_refs에서는 단일 트랜잭션 내에서 모든 packed-refs 삭제 작업을 수행합니다. 삭제 작업 중 하나가 실패하면 모든 삭제 작업을 건너뜁니다.
실제로는 호출하기 전에 각 해시를 확인하기 때문에 오류가 발생하면 안 됩니다.delete_refs그러나 일부 네트워크 오류 또는 홀수 권한 문제는 이 변경 후 다른 결과를 가져올 수 있습니다.

또한 파일 백업 삭제는 동일한 트랜잭션에서 수행되지 않으므로 packed-refs 트랜잭션이 실패하더라도 성공할 수 있습니다.

분기를 삭제한 후에는 분기 참조가 제거되고 이후에 다시 추가되지 않은 경우에만 분기 구성을 제거합니다.

24,000개의 태그를 삭제하는 수동 테스트는 다음을 사용하여 약 30분이 걸렸습니다.delete_ref.
다음을 사용하여 약 5초 정도 걸립니다.delete_refs.

당신은 이 작은 물건을 좋아할 것입니다...목록을 끌어다 놓고 각 항목의 확인을 요청한 후 최종적으로 모든 선택 항목을 삭제합니다.

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`

자그 접근법이 있습니다...

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.

내게 맞는 말입니다.

git branch | xargs git branch -d

git branch | xargs git branch -D

모든 로컬 분기 삭제

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

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

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

편집: Mac OS를 사용 중입니다.

할 수 .git branch -D $(printf "%s\n" $(git branch) | grep '3.2')

텍스트 파일(branch-to-del.txt)에서 삭제할 모든 분기(branch-to-del.txt)가 있는 경우 다음 작업을 수행하여 원격(원본)에서 모든 분기를 삭제할 수 있습니다. xargs -a branches-to-del.txt git push --delete origin

제 구체적인 사건이 해결되지 않아서 새로운 답변을 하는 중입니다

시나리오:

  • 새로 복제된 repo
  • 로컬 분기가 생성되지 않음
  • 많은 원격 지점(내 경우 100개 이상)
  • 분기인 모든특분삭제싶습고다니하기를 모두 하고 싶습니다.feature/myfeature

다음은 제가 작업한 명령입니다.

git branch  -a | cut -c3- | grep 'origin\/feature' | sed 's/remotes\/origin\///' | xargs git push origin --delete

@gwai가 저를 올바른 방향으로 이끌어 주셔서 감사합니다.

창에 있는 경우 파워셸을 사용하여 다음 작업을 수행할 수 있습니다.

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

체교다를 feature/*당신이 원하는 어떤 패턴대로.

오늘 구식 로컬/원격 지점의 대규모 집합을 정리했습니다.

다음은 제가 수행한 방법입니다.

텍스트 파일에 모든 분기 이름 나열:

git branch -a >> BranchNames.txt

삭제할 분기를 "git branch -D -r" 명령에 추가합니다.

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

cmd를 실행합니다.

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

이 방법은 다른 답변에 나와 있는 것처럼 가장 현명한 방법은 아닐 수도 있지만, 이 방법은 매우 간단하고 사용하기 쉽습니다.

에 의해 에, ▁g▁as▁▁to▁the▁branches▁deleteit어?▁why까▁the▁don▁are▁g니▁by습으로 가는 브랜치를 삭제하는 것은 어떨까요.git/ref그런 다음 저장소에 관심이 없는 항목이 있으면 자동으로 쓰레기가 수집되므로 번거롭게 할 필요가 없습니다.

언급URL : https://stackoverflow.com/questions/3670355/can-you-delete-multiple-branches-in-one-command-with-git

반응형