Usuń lokalne gałęzie Git po usunięciu ich na zdalnym repo

Chcę, aby moje lokalne i zdalne repozytoria były zawsze zsynchronizowane pod względem gałęzi.

Po przeglądzie Pull Request na Githubie, scalam i usuwam tam swoją gałąź (zdalną). Jak mogę pobrać te informacje do lokalnego repozytorium i zmusić Git do usunięcia mojej lokalnej wersji gałęzi?

Author: sf89, 2013-08-01

12 answers

The quick way

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

NB: jeśli nie jesteś na master, może to spowodować usunięcie gałęzi. Czytaj dalej "lepszy sposób".

Upewnij się, że utrzymamy mistrza

Możesz upewnić się, że master, ani żadna inna gałąź nie zostanie usunięta przez grep ing po więcej. W takim przypadku możesz wybrać:

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

Więc jeśli chcemy zachować master, develop i staging na przykład:

git branch --merged | grep -v "\*" | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d

Make this an alias

Ponieważ jest trochę długi, możesz dodać alias do swojego .zshrc lub .bashrc. Mój nazywa się gbpurge (dla git branches purge):

alias gbpurge='git branch --merged | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d'

Następnie przeładuj swój .bashrc lub .zshrc:

. ~/.bashrc

Lub

. ~/.zshrc
 183
Author: sf89,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-02 06:51:47

Używam tego samego flow z GitHub i nie znalazłem poprzednich odpowiedzi, które mnie satysfakcjonują, ponieważ git branch --merged wymienia gałęzie, które zostały połączone, ale nie każda z nich została zdalnie usunięta w moim przypadku. Więc to mi się udało:

git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d

Gdzie:

  • git fetch --all -p: zaktualizuj status lokalnych oddziałów
  • git branch -vv: wyświetla status lokalnych oddziałów
  • grep ": gone]": filtry usunięte
  • awk '{ print $1 }': wyodrębnij ich nazwy
  • xargs -n 1 git branch -d: podaj nazwę do delete polecenie

Uwaga: jeśli wolisz, możesz użyć -D zamiast-d, co wymusza usunięcie.

Na przykład:

someUsr@someHost:~/repo$ git branch -a
basic-testing
integration-for-tests
* master
origin
playground-for-tests
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services

someUsr@someHost:~/repo$ git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
Fetching origin
Deleted branch integration-for-tests (was fbc609a).
Deleted branch playground-for-tests (was 584b900).

someUsr@someHost:~/repo$ git branch -a
basic-testing
* master
origin
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services

Odniesienie:

Http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches

 89
Author: Alessio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-25 06:35:57

Spróbuj:

git pull --prune

Który usuwa lokalną gałąź, jeśli jej odpowiednia zdalna gałąź zostanie usunięta.

Aktualizacja:

Powyższe stwierdzenie nie jest takie poprawne.

W rzeczywistości uruchamianie git pull --prune spowoduje usunięcie tylko gałęzi zdalnego śledzenia , takich jak

remotes/origin/fff
remotes/origin/dev
remotes/origin/master

Następnie możesz uruchomić git branch -r, aby sprawdzić gałęzie zdalnego śledzenia pozostawione na twoim komputerze. Załóżmy, że lewe gałęzie są:

origin/dev
origin/master

Co oznacza, że gałąź origin/fff zostaje skreślona.

Więc po running git pull --prune, just run:

git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)

Możesz znaleźć wszystkie lokalne oddziały, które:

  1. nie mają już żadnych zdalnych gałęzi;
  2. można bezpiecznie usunąć.

Wtedy, <the command above> | xargs git branch -d może usunąć wszystkie z nich.

 72
Author: nicky_zs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Powinno to działać, aby uniknąć usuwania gałęzi master i development z przyjętym rozwiązaniem:

git branch --merged | egrep -v "^\*|master|development" | xargs -n 1 git branch -d
 23
Author: Intrepid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-27 17:44:11

Dla osób korzystających z powershell jest to odpowiednik odpowiedzi powyżej :

git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ }
  1. Filtruj wszystkie gałęzie, które są oznaczone jako zniknęły
  2. wywołanie git branch -D na każdym z odnalezionych oddziałów
 16
Author: amaechler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:29

Nic z tego nie działało. Możesz zobaczyć moją drugą odpowiedź tutaj: https://stackoverflow.com/a/34969726/550454

Ale zasadniczo mam teraz to w moim ~/.gitconfig:

[alias]
  prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -d
 6
Author: Karl Wilbur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:47

Bardzo proste rozwiązanie: Usuń lokalny repo i Sklonuj na nowo zdalny. Może nie wydawać się zbyt eleganckie, ale jest proste i zrozumiesz dokładnie, co robisz bez czytania stron podręcznika: -).

 5
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-13 21:37:43

Po prostu robię to, aby usunąć połączone oddziały lokalne:

git branch -d $(git branch --merged)

I w przypadku, gdy chcesz usunąć nieistniejące trackingi też:

git pull --prune
 2
Author: alacambra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-07 07:57:45

W przypadku, gdy po prostu wypchnąłeś i połączyłeś swoją gałąź z master, wykonaj następujące czynności w git bash:

git branch -d branch_name_to_delete

Jeśli jesteś aktualnie w tej gałęzi, to popchnie cię z powrotem do mistrza. W tym momencie wykonaj pociągnięcie

git pull
 2
Author: Joshua Schlichting,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-19 19:26:16

Napisałem tę jedną linijkę, aby wymienić wszystkie lokalne gałęzie, które nie mają odpowiedniej gałęzi zdalnej:

diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -

Po tym, usunięcie tych lokalnych gałęzi jest łatwe za pomocą xargs:

diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -|xargs -r git branch -d
 1
Author: ks1322,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-01 15:48:23

Miałem to samo pytanie i mogłem je rozwiązać za pomocą prostej linii poleceń:

git branch -d $(git branch --merged | grep -v "master")

Przede wszystkim zrób git pull origin aby upewnić się, że będzie działać dobrze.

Subshell najpierw zwraca wszystkie gałęzie, które zostały połączone z bieżącą gałęzią (upewnij się, że masz gałąź master sprawdzoną!!!), z wyjątkiem master, który może być na liście, jeśli nie użyjesz grep -v. Następnie wszystkie połączone gałęzie zostaną po prostu usunięte z lokalnego repo przez git branch -d <branch_1> <branch_n>

 0
Author: gpaulini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-05 00:22:04

Głosowana odpowiedź ma potencjał do usunięcia mistrza. Poniżej praktyczny przykład.

Miałem dwie gałęzie funkcji hemen_README i hemen_BASEBOX, które zostały połączone w develop, a następnie develop zostało połączone w master. Gałęzie funkcji hemen_README i hemen_BASEBOX zostały usunięte zdalnie, ale nadal pojawiały się lokalnie. I nie jestem na mistrzu lokalnie, ale na rozwoju.

W takim przypadku

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                      671ad6c Merged in hemen_README (pull request #1)
        hemen_BASEBOX                a535c0f added global exec paths to puppet manifest
        hemen_README                 ba87489 Updated Readme with considerable details
        master                       8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop       671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/hemen_BASEBOX a535c0f added global exec paths to puppet manifest
        remotes/origin/hemen_README  ba87489 Updated Readme with considerable details
        remotes/origin/master        2f093ce Merged in develop (pull request #3)

Więc jeśli wykonam powyższe częściowe polecenie

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch --merged | grep -v "\*"
        hemen_BASEBOX
        hemen_README
        master

Zauważ, że pokazuje również master, który w końcu zostanie usunięty.

W każdym razie udało mi się to zrobić. Udostępniam wam mój dziennik sesji, w jaki sposób to osiągnąłem.
    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin --dry-run
    Pruning origin
    URL: [email protected]:hemenkapadiapublic/vagrant-webdev.git
     * [would prune] origin/hemen_BASEBOX
     * [would prune] origin/hemen_README
    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin 
    Pruning origin
    URL: [email protected]:hemenkapadiapublic/vagrant-webdev.git
     * [pruned] origin/hemen_BASEBOX
     * [pruned] origin/hemen_README
Właśnie sprawdzałem, co będzie przycinane, a potem przycinane. patrząc na komendę oddziału poniżej zajęliśmy się pilotami
    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                671ad6c Merged in hemen_README (pull request #1)
        hemen_BASEBOX          a535c0f added global exec paths to puppet manifest
        hemen_README           ba87489 Updated Readme with considerable details
        master                 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/master  2f093ce Merged in develop (pull request #3)

A teraz Usuń lokalne oddziały

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_BASEBOX 
    Deleted branch hemen_BASEBOX (was a535c0f).
    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_README
    Deleted branch hemen_README (was ba87489).
Dobrze, że teraz gałęzie są pożądane.
    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                671ad6c Merged in hemen_README (pull request #1)
        master                 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/master  2f093ce Merged in develop (pull request #3)
 -2
Author: Hemen Kapadia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-04 05:30:11