Kaip pašalinti visus sujungtus filialus?

Turiu daug git šakų. Kaip ištrinti jau sujungtus filialus? Ar yra paprastas būdas juos pašalinti, o ne ištrinti juos po vieną?

1394
25 мая '11 в 18:54 2011-05-25 18:54 Nyambaa yra nustatytas gegužės 25 d . 11 val. 18:54 2011-05-25 18:54
@ 40 atsakymų
  • 1
  • 2

UPDATE:

Galite pridėti kitus filialus, kad juos pašalintumėte kaip kapitoną ir dev, jei jūsų darbo eiga turi juos kaip galimą protėvį. Paprastai išjungiu sprinto starto žymą ir kapitonas, dev ir qa nėra protėviai.

Jei norite ištrinti visus vietinius filialus, kurie jau yra sujungti į dabartinį pažymėtą filialą:

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

Jūs galite pamatyti, kad kapitonas ir dev yra neįtraukti, jei jie yra protėviai.


Galite ištrinti susijungusį vietinį skyrių su:

 git branch -d branchname 

Jei jis nėra sujungtas, naudokite:

 git branch -d branchname 
border=0

Jei norite pašalinti ją iš konsolės senesnėse „Git“ versijose, naudokite:

 git push origin :branchname 

Vėlesnėse „Git“ versijose naudokite:

 git push --delete origin branchname 

Pašalinus filialą iš nuotolinio įrenginio, galite apipjauti, kad atsikratytumėte nuotolinio stebėjimo filialus su:

 git remote prune origin 

arba supjaustykite atskiras nuotolinio stebėjimo šakas, kaip siūlo kitas atsakymas, naudojant:

 git branch -dr branchname 

Tikiuosi, kad tai padės.

2352
25 мая '11 в 19:40 2011-05-25 19:40 atsakymą davė Adam Dymitruk gegužės 25 d. 11 val. 1940 40 2011-05-25 19:40

Jei norite ištrinti visus nuotolinio serverio filialus, kurie jau yra sujungti:

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

Vėlesnėse „Git“ versijose

 git branch -r --merged | grep -v master | sed 's/origin\///' | xargs -n 1 git push --delete origin 
340
09 авг. atsakymas pateikiamas kuboon 09 rug . 2013-08-09 11:45 '13, 11:45 am 2013-08-09 11:45

Tiesiog šiek tiek pleiskite Adomą:

Pridėkite tai savo git config -e --global konfigūracijai, naudodami git config -e --global

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

Ir tada galite pašalinti visus vietinius susiliejusius filialus naudodami paprastą git cleanup .

140
18 февр. atsakymas pateikiamas real_ate 18 vas . 2014-02-18 18:08 '14 at 18:08 2014-02-18 18:08

Taip pat galite ištrinti visus susijungusius filialus, išskyrus kapitoną.

 git branch --merged | grep -v '^* master$' | grep -v '^ master$' | xargs git branch -d 
73
07 февр. Atsakymą pateikė Ismael Abreu 07 vasaris. 2013-02-07 04:06 '13, 4:06, 2013-02-07 04:06

Norite išskirti master filialus ir develop iš šių komandų.

Vietinis git išvalymas:

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

Nuotolinis git valymas:

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

Sinchronizuokite nuotolinių filialų vietinį registrą:

 git fetch -p 
60
03 июля '14 в 19:18 2014-07-03 19:18 atsakymą pateikė Guido Boumanas liepos 03 d. 14 val. 19:18 2014-07-03 19:18

Tiems iš jūsų, kurie naudojasi „Windows“ ir pageidauja „PowerShell“ scenarijų, tai ištrina vietinius susijungusius filialus:

 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 Atsakymą pateikė Klas Mellbourn birželio 10 d. 14 val

Git Sweep su ja susiduria.

19
04 февр. atsakymas pateiktas paul 04 Feb. 2013-02-04 16:53 '13, 16:53, 2013-02-04 16:53

Galite pridėti priskirtą parinktį „sujungta“. Taigi galite įsitikinti, kad ištrinami tik tie filialai, kurie yra sujungiami, ty kilmė / kapitonas.

Ši komanda pašalins sujungtus filialus iš jūsų šaltinio.

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

Galite patikrinti, kurie filialai bus ištrinti pakeisdami „git push -delete“ pradžią aidu

 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 Atsakymą pateikė Jörn Reimerdes liepos 8 d. 14 d. 9:28 2014-07-08 09:28

Naudojant „Git“ versiją 2.5.0:

 git branch -d `git branch --merged` 
12
14 сент. atsakymas pateikiamas 14 sep . 2015-09-14 19:20 '15, 19:20, 2015-09-14 19:20

Pašalinu jau susietus vietinius ir tolimus filialus naudodamas šį Ruby scenarijų. Jei tai darau dėl saugyklos su keliais nuotoliniais įrenginiais ir tiesiog noriu jį pašalinti, tiesiog įtraukiu pasirinkimo pareiškimą į nuotolinių kompiuterių sąrašą, kad gautumėte tik nuotolinius nuotolinius modulius.

11
28 сент. Atsakymą pateikė mmrobins Sep 28 2012-09-28 02:41 '12, 02:41 am 2012-09-28 02:41

Atsakymas kuboon praleido, pašalindamas filialus, turinčius žodžio pavadinimą šakos pavadinime. Toliau patobulintas jo atsakymas:

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

Žinoma, jis neištrina „pagrindinio“. :)

8
04 окт. atsakymas pateikiamas Paras 04 okt. 2013-10-04 09:05 '13, 09:05 2013-10-04 09:05

Pašalinkite susijungusius filialus „PowerShell“ konsolėje

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

Žr. „ GitHub for Windows“

8
27 янв. Konstantino Tarkuso atsakymas sausio 27 d 2015-01-27 17:17 '15, 17:17, 2015-01-27 17:17

Git'e nėra jokių komandų, kurios tai padarys automatiškai. Bet galite parašyti scenarijų, kuris naudoja „Git“ komandas, kad suteiktų jums tai, ko jums reikia. Tai galima padaryti įvairiais būdais, atsižvelgiant į naudojamą šakos modelį.

Jei jums reikia žinoti, ar filialas buvo sujungtas su pagrindiniu, ši komanda neveiks, jei „myTopicBranch“ bus sujungta (t. Y. Galite ją ištrinti)

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

Galite naudoti „Git“ filialo komandą ir analizuoti visus „Bash“ filialus ir užpildyti kilpą visuose filialuose. Šiame cikle patikrinkite aukščiau nurodytą komandą, jei galite ištrinti filialą.

7
26 мая '11 в 10:41 2011-05-26 10:41 atsakymas pateikiamas ralphtheninja Geg 26 '11, 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 ištrins visus vietinius filialus, išskyrus esamą paskelbtą filialą ir (arba) master .

Čia yra naudingas straipsnis tiems, kurie nori suprasti šias komandas: „ Git Clear“: ištrinkite jau susijungusius filialus Stephen Harman .

6
24 окт. atsakymas duotas styger 24 oct. 2014-10-24 00:06 '14 - 0:06 2014-10-24 00:06

Aš daug metų naudoju Adomo atsakymus. Tačiau yra kartų, kai jis elgėsi taip, kaip tikėjausi:

  1. filialai, kuriuose yra žodis „meistras“, buvo ignoruojami, pavyzdžiui, „notmaster“ arba „meistriški“, o ne tik pagrindiniai filialai
  2. filialai, kuriuose yra žodis "dev", buvo ignoruojami, pavyzdžiui, "dev-test", o ne tik dev filialas
  3. panaikinti filialus, pasiekiamus iš dabartinio filialo HEAD (ty nebūtinai vadovaujant)
  4. atskiroje HEAD būsenoje, ištrinant kiekvieną filialą, prieinamą iš dabartinio įsipareigojimo

1 ir 2 buvo paprasčiausiai sprendžiami tik pasikeitus įprastai išraiškai. 3 priklauso nuo to, ką norite (pvz., Ištrinti filialus, kurie nebuvo sujungti į pagrindinį ar prieš dabartinį filialą). 4 gali būti pražūtingas (nors atsigauti su git reflog ), jei jūs netyčia git reflog yra atskiroje HEAD valstybės.

Galiausiai, aš norėjau, kad viskas būtų viename sluoksnyje, kuriam nereikėjo atskiro (Bash | Ruby | Python) scenarijaus.

Tl; DR

Sukurkite „git-alias“ „sweep“, kuris priima neprivalomą -f vėliavą:

 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' 

ir jį pavadinkite:

 git sweep 

arba

 git sweep -f 

Ilgas ir išsamus atsakymas

Man buvo lengviausia sukurti git repo pavyzdį su kai kuriais filialais ir įsipareigoju patikrinti, ar tinkamai elgiamasi:

Sukurkite naują „Git“ saugyklą su vienu įvykiu

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

Naujų filialų kūrimas

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

Pageidaujamas elgesys: pasirinkite visus susijungimus turinčius filialus, išskyrus: master, develop arba current

Pradinė įprastinė išraiška praleidžia „meistriškus“ ir „notmaster“ filialus:

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

Su atnaujinta reguliari išraiška (kuri dabar išskiria „plėtoti“, o ne „dev“):

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

Perjunkite į „foo“ filialą, atlikite naują įsipareigojimą, tada patikrinkite naują „foobar“ filialą, pagrįstą „foo“:

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

Mano dabartinis filialas yra foobar, ir, jei iš naujo paleidžiu pirmiau nurodytą komandą, kurią norite ištrinti, „foo“ filialas yra įjungtas, nors jis nebuvo sujungtas su vedliu:

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

Tačiau, jei paleisiu tą pačią komandą kapitale, „foo“ filialas neįsijungia:

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

Ir tai yra tik todėl, kad git branch --merged numatytasis atitinka dabartinio filialo HEAD, jei nenurodyta kitaip. Bent jau mano darbo eigoje nenoriu ištrinti vietinių filialų, jei jie nebuvo sujungti į pagrindinį kompiuterį, todėl norėčiau pasirinkti šią parinktį:

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

Atskira HEAD būsena

Remiantis numatytu elgsenos git branch --merged , atskirtos HEAD būklės padariniai yra dar svarbesni:

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

Tai pašalintų filialą, kurį aš tik buvau, „foobar“ kartu su „foo“, kuris beveik neabejotinai yra norimas rezultatas. Tačiau su mūsų pataisyta komanda:

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

Viena eilutė, įskaitant faktinį ištrynimą

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

Visi „git“ įvynioti slapyvardžiai „sweep“:

 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' 

Pavadinimas priima papildomą -f vėliavą. Pagal numatytuosius nustatymus naudojama tik filialų, kurie buvo sujungti į pagrindinį kompiuterį, ištrynimas, tačiau -f vėliava pašalina filialus, kurie buvo sujungti į esamą filialą.

 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 atsakymas pateikiamas eddies, liepos 20, 18 d., 9:48 ; 2018-07-20 09:48

Adam “ slapyvardžio versija atnaujino atsakymą :

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

Taip pat žr. Šį atsakymą naudingiems patarimams, kaip apsaugoti sudėtingus slapyvardžius.

5
30 сент. Atsakyti Eliot 30 Sep. 2016-09-30 22:54 '16 at 22:54 pm 2016-09-30 22:54

Galite naudoti „ git-del-br įrankį .

 git-del-br -a 

Galite ją įdiegti per „ pip

 pip install git-del-br 

PS: aš esu įrankio autorius. Visi pasiūlymai / atsiliepimai yra sveikintini.

5
19 июля '16 в 21:50 2016-07-19 21:50 atsakymas duotas tusharmakkar08 liepos 19, 16, 16:50 2016-07-19 21:50

Žemiau pateiktas prašymas veikia man

 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 

ir jis filtruos bet kokį filialą grep kanale.

Veikia gerai „http“ klone, bet ne taip gerai ssh ryšiams.

4
19 янв. atsakymą pateikė vartotojo1460965 19 sausio. 2018-01-19 13:50 '18, 15:50 nuo 2018-01-19 13:50

Išbandykite šią komandą:

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

Naudodami „ git rev-parse gausite dabartinio filialo pavadinimą, kad jį pašalintumėte. Jei gausite klaidą, tai reiškia, kad vietos filialai nėra ištrinti.

Jei norite tai padaryti su nuotoliniais filialais (pakeisti origin į nuotolinį pavadinimą), pabandykite:

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

Jei turite kelis nuotolinio valdymo pultus, pridėkite grep origin | cut kad filtruotų tik origin .

Jei aukščiau pateikta komanda nėra vykdoma, pirmiausia pabandykite ištrinti susietus nuotolinio stebėjimo filialus:

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

Tada git fetch pašalinkite iš naujo ir vėl naudokite ankstesnę git push -vd .

Jei naudojate jį dažnai, apsvarstykite galimybę ~/.gitconfig slapyvardžių į savo ~/.gitconfig failą.

Jei git reflog keletą filialų, naudokite git reflog kad rastumėte prarastus įsipareigojimus.

4
17 дек. atsakymas duotas kenorb 17 dec. 2016-12-17 15:17 '16 at 15:17 pm 2016-12-17 15:17

Remiantis kai kuriais iš šių atsakymų, aš padariau savo „bash“ scenarijų, kad tai padarytum !

Jis pašalina filialus, kurie buvo git branch --merged ir naudoja git branch --merged ir git branch -d .

 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 окт. atsakymas, duotas ausų spalvas spalio 15 d. 2013-10-15 20:13 '13, 20:13, 2013-10-15 20:13

Aš naudoju git-flow srautą, kuris yra labai saugus:

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

Iš esmės atrodo, kad susiliejęs įsipareigoja pradėti nuo fix/ feature/ .

4
23 авг. Atsakymas pateikiamas Čado M 23 rug. 2016-08-23 04:15 '16 at 4:15 am 2016-08-23 04:15

Jei norite ištrinti visus vietinius filialus, kurie jau buvo sujungti į filialą, kuriame esate dabar, aš pateikiau saugią komandą, remiantis ankstesniais atsakymais:

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

Ši komanda nepaveiks jūsų dabartinio filialo ar pagrindinio filialo. Jis taip pat pasakys jums, ką jis daro, prieš vėliavą.

4
23 янв. atsakymas duotas chrismendis Jan 23 2014-01-23 19:24 '14, 19:24, 2014-01-23 19:24

Parašykite scenarijų, kuriame „Git“ patikrina visus filialus, kurie buvo sujungti su kapitonu.

Tada paleiskite git checkout master .

Galiausiai ištrinkite susijungusius filialus.

 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 авг. Atsakymas pateikiamas Komu 09 rug . 2017-08-09 16:42 '17, 16:42 pm 2017-08-09 16:42

Sprendimas yra gana geras, tačiau jis turi vieną problemą: jis taip pat pašalina vietines filialus, kurie dar nėra sujungti į tolimą.

Jei pažvelgsite į rezultatą, pamatysite kažką panašaus

 $ 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) 

Filialai bla ir issue_248 yra vietiniai filialai, kurie bus ištrinti tyliai.

Bet jūs taip pat galite pamatyti žodį [gone] , kuris nurodo filialus, kurie buvo paspaudę ant nuotolinio valdymo pulto (kuris dabar dingo), ir taip nurodo šakas, kurias galima ištrinti.

Taigi, pirminis atsakymas gali būti pakeistas į (padalintas į kelių eilučių trumpesnį eilutės ilgį)

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

apsaugoti dar nesusijungusius filialus. Be to, nereikia, kad vedlys ją apsaugotų, nes jis turi konsolę pagal kilmę ir jis neatsiranda kaip kairė.

2
15 июня '18 в 11:53 2018-06-15 11:53 atsakymą pateikė Heiko Rupp birželio 15 d. 18 val. 11:53 2018-06-15 11:53

Nuo 2018.07

Pridėkite tai savo ~/.gitconfig : [alias] skiltyje:

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

Dabar galite tiesiog skambinti „ git sweep kad atliktumėte reikiamą valymą.

1
01 июля '18 в 10:49 2018-07-01 10:49 atsakymas suteikiamas liepos 1 d., 18 val., 10:49, 2018-07-01 10:49

„Windows“ sistemoje galite įdiegti „ Cygwin“ ir ištrinti visus ištrintus filialus naudodami šią komandą:

 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 сент. atsakymas, kurį pateikė Seyed Morteza Mousavi 09 rugsėjis 2018-09-09 10:17 '18 prie 10:17 pm 2018-09-09 10:17

Norėdami išvengti atsitiktinio komandos paleidimo iš bet kurio kito filialo, išskyrus vedlį, naudoju šį „bash“ scenarijų. Priešingu atveju paleiskite 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 iš filialo, kuris buvo sujungtas su neįgaliu vedliu, gali pašalinti pagrindinį filialą.

 #!/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 янв. Robert Kajic atsakymas dėl sausio 20 d 2014-01-20 20:05 „14, 20:05 2014-01-20 20:05

Mano įnašas Bash scenarijus pagrįstas mmrobino atsakymu .

Būtina nurodyti kai kuriuos naudingus parametrus, įskaitant ir neįtraukti, arba tik vietinius ar nuotolinius filialus, o ne juos patikrinti.

Jei naudojate šakotąjį modelį, pvz., „HubFlow“ arba „GitFlow“, galite naudoti šią komandą, kad pašalintumėte susijungusias funkcijų šakas:

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

0
26 февр. Atsakymas suteikiamas bedr. 26 vasaris. 2015-02-26 17:02 '15 at 17:02 2015-02-26 17:02
  • 1
  • 2

Kiti klausimai apie žymes arba Užduoti klausimą