Śledzenie pojedynczego oddziału zdalnego jako oddziału lokalnego jest dość proste.
$ git checkout --track -b ${branch_name} origin/${branch_name}
Przeniesienie wszystkich lokalnych oddziałów do zdalnego, w razie potrzeby tworzenie nowych oddziałów zdalnych jest również łatwe.
$ git push --all origin
Chcę zrobić odwrotnie. Jeśli mam X zdalnych oddziałów w jednym źródle:
$ git branch -r
branch1
branch2
branch3
.
.
.
Czy mogę utworzyć lokalne gałęzie śledzenia dla wszystkich tych zdalnych oddziałów bez konieczności ręcznego tworzenia każdego z nich? Powiedz na przykład:
$ git checkout --track -b --all origin
Szukałem w Google i RTM, ale do tej pory wpadłem na pryczę.
git checkout --track origin/branchname
git pull origin
i naciśnijtab
, aby uzyskać listę zdalnych gałęzi. Następnie kontynuuj pisanie i naciśnijreturn
.Odpowiedzi:
Korzystanie z basha:
po git 1.9.1 przed git 1.9.1Zaktualizuj oddziały, zakładając, że nie ma zmian w lokalnych oddziałach śledzenia:
Zignoruj niejednoznaczne ostrzeżenia dotyczące refname, git wydaje się preferować lokalny oddział tak, jak powinien.
źródło
git pull
ma--all
przełącznik, który pobierze + scali wszystkie śledzone gałęzie.Odpowiedź udzielona przez Otto jest dobra, ale wszystkie utworzone gałęzie będą miały „origin /” na początku nazwy. Jeśli chcesz, aby ostatnia część (po ostatnim /) była twoimi wynikowymi nazwami gałęzi, użyj tego:
Ma również tę zaletę, że nie daje żadnych ostrzeżeń o niejednoznacznych referencjach.
źródło
grep -v master
tegogrep -v /HEAD
? Wydaje się, że odfiltrowuje domyślną gałąź, bez konieczności dostosowywaniaWiększość odpowiedzi tutaj zbytnio komplikuje analizowanie danych wyjściowych
git branch -r
. Możesz użyć następującejfor
pętli, aby utworzyć gałęzie śledzenia dla wszystkich gałęzi na pilocie, w ten sposób.Przykład
Powiedzmy, że mam te zdalne oddziały.
Potwierdź, że nie śledzimy już lokalnie niczego poza głównym:
Możesz użyć tego jednego linera do tworzenia gałęzi śledzenia:
Teraz potwierdź:
Aby je usunąć:
Jeśli użyjesz
-vv
przełącznika dogit branch
, możesz potwierdzić:Podział pętli for
Pętla w zasadzie wywołuje polecenie
git branch -r
, odfiltrowując z wyjścia wszelkie gałęzie HEAD lub master, używającgrep -vE "HEAD|master"
. Aby uzyskać nazwy tylko gałęzi bezorigin/
podłańcucha, używamy operacji na łańcuchach Basha${var#stringtoremove}
. Spowoduje to usunięcie ze zmiennej napisu „stringtoremove”$var
. W naszym przypadku usuwamy ciągorigin/
ze zmiennej$i
.UWAGA: Alternatywnie możesz również
git checkout --track ...
to zrobić:Ale nie obchodzi mnie ta metoda, ponieważ przełącza cię między gałęziami, gdy wykonuje kasę. Po zakończeniu pozostawi cię na ostatniej utworzonej gałęzi.
Bibliografia
źródło
Aktualizacja Q1 2020: Mohsen Abasi proponuje w komentarzach , na podstawie 2014 SLM „s odpowiedzi , prostszą alternatywę:
I używa
$()
zamiast przestarzałych grawitacji .Jak wspomniałem w innej starej odpowiedzi , używanie
git for-each-ref
jest prawdopodobnie szybsze .I chciałbym użyć nowego (GIT 2.23+)
git switch
polecenia , który zastępuje mylącegit checkout
.W ten sposób nie jest
grep
potrzebne.Stara (2011) oryginalna odpowiedź:
Oto moja jedna linijka, której używam (w powłoce bash, przetestowana za pomocą msysgit1.7.4):
W przypadku kopiowania i wklejania:
Aby uzyskać większą czytelność:
remote
zmiennej (może to być „origin
” lub jakakolwiek inna nazwa, którą nadałeś jednemu z pilotów bieżącego repozytorium Git).origin/a/Branch/Name => a/Branch/Name
poprzezawk
wyrażenie.ustawi gałąź upstream przez
--set-upstream-to
(lub-u
) , nie--track
:Zaletą jest to, że jeśli gałąź już istnieje, nie zawiedzie i nie zmieni pochodzenia gałęzi, tylko skonfiguruje
branch.xxx.(remote|merge)
ustawienie.To polecenie utworzy lokalne gałęzie dla wszystkich zdalnych gałęzi nadrzędnych i ustawi ich zdalne i scalające ustawienia na tę zdalną gałąź.
źródło
--set-upstream-to
zamiast--track
chociaż.git switch
zamiastgit checkout
. Ale twój (bardzo dobry) pomysł pozostaje.Można by to łatwo napisać, ale nie wiem, kiedy będzie to cenne. Te gałęzie dość szybko pozostawałyby w tyle i musiałbyś je cały czas aktualizować.
Zdalne gałęzie będą automatycznie aktualizowane, więc najłatwiej jest po prostu utworzyć oddział lokalny w miejscu, w którym faktycznie chcesz nad nim pracować.
źródło
git up
aktualizuje wszystkie lokalne oddziały.źródło
| grep -v HEAD
do potoku, aby działał poprawnie.bez skryptów (w pustym katalogu):
po tym wszystkie zdalne gałęzie będą postrzegane jako lokalne.
oryginał (w języku rosyjskim) .
źródło
Jeśli chcesz używać PowerShell, a Twój pilot nazywa się origin. Wtedy to działa.
źródło
git svn clone'd
repozytorium:git branch -r | %{$_ -replace " origin/"} | %{git checkout -b $_ "origin/$_"}
git branch -r | %{$_ -replace " origin/"} | %{git branch -u "origin/$_" $_}
Użyj tego, a nie będziesz mieć takiego ostrzeżenia, jak: nazwa referencyjna „pochodzenie / dev” jest niejednoznaczna
źródło
Oto moje rozwiązanie polecenia BASH odwołujące się do @tjmcewan:
Moim celem jest rozwiązanie problemu polegającego na tym, że wszystkie utworzone gałęzie będą miały „origin /” na początku nazwy, ponieważ sprawdziłem, że zmienne zdalne $ nadal zawierają „origin /”:
źródło
Aby zrobić to samo, co odpowiedź tjmcewan, ale w systemie Windows, wywołaj to z pliku wsadowego :
Lub to z linii poleceń :
źródło
Od git 2.23 wzwyż:
-C
Flaga dlagit switch
tworzy lub resetuje, jeśli już istnieje.dokumentacja przełącznika git
źródło
Na wypadek, gdybyś już wyewidencjonował niektóre gałęzie i chcesz
możesz użyć następującego skryptu kompatybilnego z bash i zsh:
źródło
Wyjaśnienie:
linia 1: „git branch -r” (po którym następuje „git remote update”, aby zaktualizować informacje o zmianach w zdalnym) wyświetla wszystkie zdalne gałęzie; 'egrep -vw' jest używane do wybicia wpisów mających w wyniku HEAD i master.
linia 3: Śledź nazwaną zdalną gałąź podczas sprawdzania jej lokalnie. Prosty awk jest używany, aby uniknąć 'origin /' będącego sufiksem dla lokalnych gałęzi.
źródło
Używając basha, jeśli chcesz sprawdzić wszystkie gałęzie:
Ważne jest, aby pamiętać, że kiedy wykonujesz pobieranie, które obniża nowe gałęzie zdalnego śledzenia, nie masz automatycznie lokalnych, edytowalnych kopii ich.
źródło