Kako ukloniti sve git gitove koji su spojeni?

Imam puno git grana. Kako izbrisati grane koje su već spojene? Postoji li jednostavan način da ih uklonite, a ne da ih obrišete jednu po jednu?

1394
25 мая '11 в 18:54 2011-05-25 18:54 Nyambaa je postavljen 25. svibnja '11 u 18:54 2011-05-25 18:54
@ 40 odgovora
  • 1
  • 2

UPDATE:

Možete dodati i druge grane kako biste ih isključili kao master i dev ako ih vaš tijek rada ima kao mogućeg pretka. Obično onemogućavam oznaku sprint-start i master, dev i qa nisu pretci.

Za brisanje svih lokalnih ogranaka koji su već spojeni u trenutačno označenu granu:

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

Možete vidjeti da su master i dev isključeni ako su preci.


Možete izbrisati spojenu lokalnu podružnicu s:

 git branch -d branchname 

Ako nije spojen, upotrijebite:

 git branch -d branchname 
border=0

Da biste ga uklonili iz konzole u starijim verzijama programa Git, upotrijebite:

 git push origin :branchname 

U kasnijim verzijama programa Git upotrijebite:

 git push --delete origin branchname 

Nakon što izbrišete granu s udaljenog uređaja, možete izrezati da biste se riješili grana za daljinsko praćenje pomoću:

 git remote prune origin 

ili skraćivanje pojedinih grana daljinskog praćenja, kako je predložio drugi odgovor, pomoću:

 git branch -dr branchname 

Nadam se da ovo pomaže.

2352
25 мая '11 в 19:40 2011-05-25 19:40 odgovor je dao Adam Dymitruk 25. svibnja 2011. u 19:40 2011-05-25 19:40

Brisanje svih grana na udaljenom poslužitelju koje su već spojene:

 git branch -r --merged | grep -v master | sed 's/origin\//:/' | xargs -n 1 git push origin 
border=0

U kasnijim verzijama Gita

 git branch -r --merged | grep -v master | sed 's/origin\///' | xargs -n 1 git push --delete origin 
340
09 авг. odgovor je dan kuboon 09 aug. 2013-08-09 11:45 '13 u 11:45 sati 2013-08-09 11:45

Samo malo širimo Adama:

Dodajte ovo u svoju git config -e --global konfiguraciju pokretanjem git config -e --global

 [alias] cleanup = "!git branch --merged | grep -v '\\*\\|master\\|develop' | xargs -n 1 git branch -d" 

A onda možete ukloniti sve lokalne spojene grane tako da pokrenete jednostavan git cleanup .

140
18 февр. odgovor je dan real_ate 18 feb . 2014-02-18 18:08 '14 u 18:08 2014-02-18 18:08

Također vam omogućuje brisanje svih spojenih grana osim glavnog.

 git branch --merged | grep -v '^* master$' | grep -v '^ master$' | xargs git branch -d 
73
07 февр. Odgovor daje Ismael Abreu 07. veljače. 2013-02-07 04:06 '13 u 4:06 2013-02-07 04:06

Želite isključiti master grane i develop iz tih naredbi.

Lokalno čišćenje:

 git branch --merged | grep -v '\*\|master\|develop' | xargs -n 1 git branch -d 

Daljinsko git čišćenje:

 git branch -r --merged | grep -v '\*\|master\|develop' | sed 's/origin\///' | xargs -n 1 git push --delete origin 

Sinkronizirajte lokalni registar udaljenih grana:

 git fetch -p 
60
03 июля '14 в 19:18 2014-07-03 19:18 odgovor je dao Guido Bouman 03. srpnja 14. u 19:18 2014-07-03 19:18

Za one od vas koji su u sustavu Windows i preferiraju PowerShell skripte, to je ono što briše lokalne spojene grane:

 function Remove-MergedBranches { git branch --merged | ForEach-Object { $_.Trim() } | Where-Object {$_ -NotMatch "^\*"} | Where-Object {-not ( $_ -Like "*master" )} | ForEach-Object { git branch -d $_ } } 
36
10 июня '14 в 17:00 2014-06-10 17:00 Odgovor daje Klas Mellbourn 10. lipnja 2014. u 17:00 sati 2014-06-10 17:00

Git Sweep se nosi s tim.

19
04 февр. odgovor je dat paul 04 Feb. 2013-02-04 16:53 '13 u 16:53 2013-02-04 16:53

U opciju -merged možete dodati obvezu. Tako možete biti sigurni da su izbrisane samo grane koje su spojene tj. Izvor / glavni.

Sljedeća naredba uklonit će spojene grane iz vašeg izvora.

 git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 git push origin --delete 

Možete provjeriti koje će se grane izbrisati zamjenom početka git push -delete s jekom

 git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 echo 
13
08 июля '14 в 9:28 2014-07-08 09:28 Odgovor je dao Jörn Reimerdes 8. srpnja 2014. u 9:28 2014-07-08 09:28

Upotreba Git verzije 2.5.0:

 git branch -d `git branch --merged` 
12
14 сент. odgovor se daje drautb 14 sep . 2015-09-14 19:20 '15 u 19:20 2015-09-14 19:20

Koristim sljedeću Ruby skriptu za uklanjanje već spojenih lokalnih i udaljenih grana. Ako to učinim za spremište s nekoliko udaljenih uređaja i samo ga želim ukloniti iz njega, jednostavno dodam naredbu select na popis udaljenih računala kako bih dobila samo udaljene udaljene module.

11
28 сент. Odgovor daje mmrobins 28. rujna 2012-09-28 02:41 '12 u 2:41 am 2012-09-28 02:41

Odgovor kuboon propustili brisanje grane koje imaju naziv riječi u ime grane. Slijedeće poboljšava njegov odgovor:

 git branch -r --merged | grep -v "origin/master$" | sed 's/\s*origin\///' | xargs -n 1 git push --delete origin 

Naravno, on ne briše "glavni" :)

8
04 окт. odgovor je dat Paras 04 okt. 2013-10-04 09:05 '13 u 9:05 2013-10-04 09:05

Uklonite spojene grane u konzoli PowerShell

 git branch --merged | %{git branch -d $_.Trim()} 

Pogledajte GitHub za Windows

8
27 янв. odgovor Konstantina Tarkusa 27. siječnja 2015-01-27 17:17 '15 u 17:17 2015-01-27 17:17

U Git-u nema naredbe koja će to učiniti automatski. Ali možete napisati skriptu koja koristi Git naredbe da vam pruži ono što vam je potrebno. To se može učiniti na različite načine, ovisno o korištenom modelu grane.

Ako morate znati je li grana spojena s glavnim, sljedeća naredba neće raditi ako je myTopicBranch spojen (tj. Možete je izbrisati)

 $ git rev-list master | grep $(git rev-parse myTopicBranch) 

Možete koristiti Git naredbu grane i analizirati sve grane u Bashu i izvršiti petlju for za sve grane. U ovom ciklusu, provjerite s naredbom iznad ako možete izbrisati granu ili ne.

7
26 мая '11 в 10:41 2011-05-26 10:41 odgovor je dat ralphtheninja 26. svibnja '11 u 10:41 2011-05-26 10:41

git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d će obrisati sve lokalne grane osim trenutne knjižene grane i / ili master .

Evo korisnog članka za one koji žele razumjeti ove naredbe: Git Clear: izbrišite već spojene grane, Stephen Harman .

6
24 окт. odgovor s obzirom na stil 24 list . 2014-10-24 00:06 '14 u 0:06 2014-10-24 00:06

Koristio sam Adamove odgovore mnogo godina. Međutim, ponekad se nije ponašao onako kako sam očekivao:

  1. grane koje sadrže riječ "majstor" ignorirane su, na primjer "notmaster" ili "masterful", a ne samo vodeća grana
  2. grane koje sadrže riječ "dev" zanemarene su, primjerice, "dev-test", a ne samo dev granu
  3. brisanje grana koje se mogu dobiti iz GLAVE trenutne grane (to jest, ne mora nužno voditi)
  4. u zasebnom HEAD stanju, brišući svaku granu dostupnu iz trenutne predaje

1 i 2 su jednostavno adresirane, samo s promjenom regularnog izraza. 3 ovisi o kontekstu onoga što želite (tj. Izbrišite grane koje nisu spojene s glavnim ili protiv trenutne grane). 4 može biti pogubno (iako se oporavlja s git reflog ), ako nehotice git reflog je u zasebnom HEAD stanju.

Konačno, htio sam da sve bude u jednom sloju, za koji nije bila potrebna zasebna (Bash | Ruby | Python) skripta.

TL; DR

Stvorite git-alias "sweep" koji prihvaća opcionalnu oznaku -f :

 git config --global alias.sweep '!f(){ git branch --merged $([[ $1 != "-f" ]] \  git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \ | xargs git branch -d; }; f' 

i nazovite je s:

 git sweep 

ili:

 git sweep -f 

Dug, detaljan odgovor

Bilo mi je najlakše stvoriti primjer git repoa s nekim granama i obvezao se provjeriti ispravno ponašanje:

Stvorite novo git repozitorij s jednim unosom

 mkdir sweep-test  cd sweep-test  git init echo "hello" > hello git add .  git commit -am "initial commit" 

Stvaranje novih grana

 git branch foo  git branch bar  git branch develop  git branch notmaster  git branch masterful git branch --list 
  bar develop foo * master masterful notmaster 

Željeno ponašanje: odaberite sve spojene grane, osim: master, develop ili current

Izvorni regularni izraz preskače "majstorske" i "notmaster" grane:

 git checkout foo git branch --merged | egrep -v "(^\*|master|dev)" 
  bar 

S ažuriranim regularnim izrazom (koji sada isključuje "razvijati", a ne "dev"):

 git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)" 
 bar masterful notmaster 

Prebacite se na foo granu, napravite novu predaju, a zatim provjerite novu ogranak foobara na temelju foo:

 echo "foo" > foo git add .  git commit -am "foo" git checkout -b foobar echo "foobar" > foobar git add .  git commit -am "foobar" 

Moja trenutna grana je foobar, a ako ponovno izvedem gornju naredbu za popis grana koje želim izbrisati, omogućena je grana "foo", iako nije spojena s čarobnjakom:

 git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)" 
  bar foo masterful notmaster 

Međutim, ako pokrenem istu naredbu na glavnom, grana "foo" se ne uključuje:

 git checkout master  git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)" 
  bar masterful notmaster 

A to je jednostavno zato što git branch --merged default odgovara HEAD trenutne grane, osim ako nije drugačije naznačeno. Barem za moj radni tijek ne želim brisati lokalne podružnice ako nisu spojene s glavnim, pa preferiram sljedeću opciju:

 git checkout foobar git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" 
  bar masterful notmaster 

Odvojite stanje HEAD

Oslanjanje na zadano ponašanje git branch --merged ima još značajnije posljedice u zasebnom stanju HEAD:

 git checkout foobar git checkout HEAD~0 git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)" 
  bar foo foobar masterful notmaster 

To bi uklonilo granu na kojoj sam bio, "foobar" i "foo", što gotovo sigurno nije željeni rezultat. Međutim, s našim revidiranim timom:

 git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" 
  bar masterful notmaster 

Jedan redak, uključujući i stvarno brisanje

 git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" | xargs git branch -d 

Svi nadimci "sweep" koji su omotani u git:

 git config --global alias.sweep '!f(){ git branch --merged $([[ $1 != "-f" ]] \  git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \ | xargs git branch -d; }; f' 

Alias ​​prihvaća dodatnu oznaku -f . Po defaultu, koristi se samo brisanje grana koje su spojene u master, ali -f zastavica uklanja grane koje su spojene u trenutnu granu.

 git sweep 
 Deleted branch bar (was 9a56952). Deleted branch masterful (was 9a56952). Deleted branch notmaster (was 9a56952). 
 git sweep -f 
 Deleted branch foo (was 2cea1ab). 
6
20 июля '18 в 9:48 2018-07-20 09:48 odgovor je dao vrtlog 20. srpnja '18 u 9:48 ; 2018-07-20 09:48

Nadimak verzija Adama ažurirao je odgovor :

 [alias] branch-cleanup = "!git branch --merged | egrep -v \"(^\\*|master|dev)\" | xargs git branch -d #" 

Također pogledajte ovaj odgovor za korisne savjete o zaštiti složenih pseudonima.

5
30 сент. Odgovor je dat Eliot 30. rujna. 2016-09-30 22:54 '16 u 22:54 2016-09-30 22:54

Možete koristiti git-del-br alat .

 git-del-br -a 

Možete ga instalirati pomoću pip

 pip install git-del-br 

PS: Ja sam autor alata. Svi prijedlozi / povratne informacije su dobrodošli.

5
19 июля '16 в 21:50 2016-07-19 21:50 odgovor je dat tusharmakkar08 19. srpnja '16 u 21:50 2016-07-19 21:50

Ispod zahtjeva radi za mene

 for branch in 'git branch -r --merged | grep -v '\*\|master\|develop'|awk 'NR > 0 {print$1}'|awk '{gsub(/origin\//, "")}1'';do git push origin --delete $branch; done 

i filtriraće bilo koju granu u grep kanalu.

Dobro radi na http klonu, ali nije toliko dobar za ssh veze.

4
19 янв. odgovor je dao user1460965 19. siječnja 2018-01-19 13:50 '18 u 1:50 pm 2018-01-19 13:50

Pokušajte sljedeću naredbu:

git branch -d $(git branch --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))

Koristeći git rev-parse , dobit ćete ime trenutne grane kako biste je isključili. Ako dobijete pogrešku, to znači da lokalne podružnice nisu izbrisane.

Da biste učinili isto s udaljenim ograncima (promijenite origin do vašeg udaljenog imena), pokušajte:

git push origin -vd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD) | cut -d/ -f2)

Ako imate više daljinskih upravljača, dodajte grep origin | za cut samo za origin .

Ako se gornja naredba ne izvrši, pokušajte prvo izbrisati spojene grane za daljinsko praćenje:

git branch -rd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))

Zatim se git fetch ponovno uklanja i ponovno koristi prethodnu git push -vd .

Ako ga često koristite, razmislite o ~/.gitconfig aliasa u datoteku ~/.gitconfig .

Ako ste pogreškom izbrisali nekoliko grana, koristite git reflog da biste pronašli izgubljene prijenose.

4
17 дек. odgovor je dan kenorb 17 dec. 2016-12-17 15:17 '16 u 15:17 2016-12-17 15:17

Na temelju nekih od tih odgovora, ja sam napravio svoj vlastiti bash skript za to !

Koristi git branch --merged i git branch -d za uklanjanje grana koje su spojene i zahtijeva svaku granu prije brisanja.

 merged_branches(){ local current_branch=$(git rev-parse --abbrev-ref HEAD) for branch in $(git branch --merged | cut -c3-) do echo "Branch $branch is already merged into $current_branch." echo "Would you like to delete it? [Y]es/[N]o " read REPLY if [[ $REPLY =~ ^[Yy] ]]; then git branch -d $branch fi done } 
4
15 окт. odgovor dano earlonrails Oct 15. 2013-10-15 20:13 '13 u 20:13 2013-10-15 20:13

Koristim shemu imenovanja git-flow esque, pa je za mene vrlo sigurna:

 git branch --merged | grep -e "^\s\+\(fix\|feature\)/" | xargs git branch -d 

U osnovi, on traži spojene objave počevši s fix/ ili feature/ .

4
23 авг. Odgovor je dan Chad M 23 aug. 2016-08-23 04:15 '16 u 4:15 am 2016-08-23 04:15

Ako želite izbrisati sve lokalne podružnice koje su već spojene u granu u kojoj se sada nalazite, smislio sam sigurnu naredbu za to, na temelju ranijih odgovora:

 git branch --merged | grep -v \* | grep -v '^\s*master$' | xargs -t -n 1 git branch -d 

Ova naredba neće utjecati na vašu trenutnu granu ili glavnu granu. Također će vam reći što radi prije nego što to učini, koristeći zastavicu -t xargs.

4
23 янв. odgovor je dan chrismendis 23. siječnja 2014-01-23 19:24 '14 u 19:24 2014-01-23 19:24

Napišite skriptu u kojoj Git provjerava sve grane koje su spojene s glavnim.

Zatim pokrenite git checkout master .

Na kraju izbrišite spojene grane.

 for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do branchnew=$(echo $k | sed -e "s/origin\///" | sed -e "s/remotes\///") echo branch-name: $branchnew git checkout $branchnew done git checkout master for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do branchnew=$(echo $k | sed -e "s/origin\///" | sed -e "s/remotes\///") echo branch-name: $branchnew git push origin --delete $branchnew done 
3
09 авг. Odgovor je dat Komu 09 aug. 2017-08-09 16:42 '17 u 16:42 2017-08-09 16:42

Odluka je prilično dobra, ali ima jedan problem: ona također uklanja lokalne podružnice koje još nisu spojene u udaljenu.

Ako pogledate rezultat, vidjet ćete nešto slično

 $ git branch --merged master -v api_doc 3a05427 [gone] Start of describing the Java API bla 52e080a Update wording. branch-1.0 32f1a72 [maven-release-plugin] prepare release 1.0.1 initial_proposal 6e59fb0 [gone] Original proposal, converted to AsciiDoc. issue_248 be2ba3c Skip unit-for-type checking. This needs more work. (#254) master be2ba3c Skip unit-for-type checking. This needs more work. (#254) 

Podružnice bla i issue_248 su lokalne podružnice koje će biti izbrisane tiho.

Ali možete vidjeti i riječ [gone] , koja označava grane koje su kliknute na daljinskom upravljaču (koje je sada nestalo) i time ukazuju na grane koje se mogu izbrisati.

Prema tome, izvorni se odgovor može promijeniti u (podijeljen na više redaka za kraću duljinu niza)

 git branch --merged master -v | \ grep "\\[gone\\]" | \ sed -e 's/^..//' -e 's/\S* .*//' | \ xargs git branch -d 

kako bi zaštitili još ne spojene grane. Također, grepping nije potreban kako bi ga čarobnjak zaštitio, budući da ima konzolu prema izvoru i ne pojavljuje se kao lijevo.

2
15 июня '18 в 11:53 2018-06-15 11:53 odgovor je dao Heiko Rupp 15. lipnja '18 u 11:53 2018-06-15 11:53

Do 2018.07

Dodajte ovo u odjeljak [alias] svog ~/.gitconfig :

 sweep = !"f() { git branch --merged | egrep -v \"(^\\*|master|dev)\" || true | xargs git branch -d; }; f" 

Sada možete jednostavno nazvati git sweep kako biste izvršili nužno čišćenje.

1
01 июля '18 в 10:49 2018-07-01 10:49 odgovor je dan sorin 1. srpnja '18 u 10:49 2018-07-01 10:49

U sustavu Windows možete instalirati Cygwin i izbrisati sve izbrisane grane pomoću sljedeće naredbe:

 git branch -r --merged | "C:\cygwin64\bin\grep.exe" -v master | "C:\cygwin64\bin\sed.exe" 's/origin\///' | "C:\cygwin64\bin\xargs.exe" -n 1 git push --delete origin 
1
09 сент. odgovor dao Seyed Morteza Mousavi rujan 09 2018-09-09 10:17 '18 u 22:17 sati 2018-09-09 10:17

Da biste izbjegli slučajno pokretanje naredbe iz bilo koje grane, osim čarobnjaka, koristim sljedeću bash skriptu. Inače, lansirajte git branch --merged | grep -v "\*" | xargs -n 1 git branch -d git branch --merged | grep -v "\*" | xargs -n 1 git branch -d git branch --merged | grep -v "\*" | xargs -n 1 git branch -d iz grane koja je spojena s onemogućenim čarobnjakom, može ukloniti glavnu granu.

 #!/bin/bash branch_name="$(git symbolic-ref HEAD 2>/dev/null)" || branch_name="(unnamed branch)" # detached HEAD branch_name=${branch_name##refs/heads/} if [[ $branch_name == 'master' ]]; then read -r -p "Are you sure? [y/N] " response if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]; then git branch --merged | grep -v "\*" | xargs -n 1 git branch -d fi else echo "Refusing to delete branches that are not merged into '$branch_name'. Checkout master first." fi 
1
20 янв. Odgovor dao Robert Kajic 20. siječnja 2014-01-20 20:05 '14 u 20:05 2014-01-20 20:05

Moj doprinos Bash skripta temelji se na mmrobin odgovoru .

Potrebno je navesti neke korisne parametre, uključujući i isključivanje, ili za provjeru / brisanje samo lokalnih ili udaljenih grana umjesto njih.

Recimo da imam daljinski zvani upstream i origin (GitHub stil, moj plug je početak, uzvodno).

Ne želim brisati BILO KOJI majstor, GLAVA ili bilo što iz uzvodnog toka. Također ne želim izbrisati razvojnu granu, jer je to naša zajednička grana, iz koje stvaramo PR.

Popis svih udaljenih grana koje su filtrirane od onih koje su spojene:

 git branch -r 

Ukloni retke s ovog popisa koje sadrže riječi koje znam u nazivima podružnica koje ne želim izbrisati:

 sed '/develop\|master\|HEAD\|upstream/d' 

Uklonite izbrisano ime iz naziva veze (podrijetlo / neko ogranak postaje neko ogranak):

 sed 's/.*\///' 

Koristite xargs za pozivanje sučelja s jednim retkom:

 xargs git push --delete origin 

Sve to zajedno:

 git branch -r --merged | sed '/develop\|master\|HEAD\|upstream/d' | sed 's/.*\///' | xargs git push --delete origin 

To će me ostaviti samo s nekim granama na kojima sam radio, ali ne i spojene. Tada ih možete izbrisati jednu po jednu, jer ih ne bi trebalo biti toliko.

Pronađite grane koje više nisu potrebne:

 git branch -ar 

Recimo da ćete pronaći granu 1, ogranak 2 i ogranak 3 koje želite izbrisati:

 git push --delete origin branch1 branch2 branch3 
0
02 июля '15 в 11:54 2015-07-02 11:54 odgovor je dat miigotu 02. srpnja u 11:54 2015-07-02 11:54

Ako koristite model grananja, kao što je HubFlow ili GitFlow, možete koristiti ovu naredbu za uklanjanje spojenih grana funkcija:

git branch --merged | grep feature.* | grep -v "\*" | xargs -n 1 git branch -d

0
26 февр. Odgovor je dan 26. veljače. 2015-02-26 17:02 '15 u 17:02 2015-02-26 17:02
  • 1
  • 2

Ostala pitanja o oznakama ili Pitanje