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?
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
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:
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:
- nie mają już żadnych zdalnych gałęzi;
- można bezpiecznie usunąć.
Wtedy, <the command above> | xargs git branch -d
może usunąć wszystkie z nich.
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
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 $_ }
- Filtruj wszystkie gałęzie, które są oznaczone jako zniknęły
- wywołanie
git branch -D
na każdym z odnalezionych oddziałów
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
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: -).
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
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
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
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>
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)
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