Pytanie Jak sklonować wszystkie odległe gałęzie w Git?


mam master i a development oddział, oba popychane do GitHub. Ja clonere, pulled, i fetched, ale nadal nie mogę uzyskać niczego innego niż master odgałęzienie wstecz.

Jestem pewien, że brakuje mi czegoś oczywistego, ale przeczytałem instrukcję i nie odczuwam żadnej radości.


3560
2017-09-15 22:42


pochodzenie


Przyjęta tutaj odpowiedź (git branch -a) pokazuje gałęzie w pilocie, ale jeśli spróbujesz je sprawdzić, będziesz w stanie "odłączonego HEAD". Kolejna odpowiedź w dół (druga najbardziej upvotes) odpowiada na inne pytanie (na przykład: jak wyciągnąć wszystkie gałęzie, i znowu działa to tylko dla tych, których śledzisz lokalnie). Kilka uwag wskazuje, że możesz sparsować git branch -a wyniki za pomocą skryptu powłoki, który będzie lokalnie śledzić wszystkie odległe gałęzie. Podsumowanie: Nie ma natywnego sposobu, aby zrobić to, co chcesz, a to może nie być tak wspaniały pomysł. - Day Davis Waterbury
Może po prostu skopiować cały folder w staroświecki sposób? scp some_user@example.com:/home/some_user/project_folder ~ Nie jestem pewien, czy to rozwiązanie działa na Github choć .. - snapfractalpop
Zamiast mówić "Sklonowałem, wyciągnąłem i przyniosłem", o wiele lepiej, żeby nam pokazać dokładne polecenia że straciłeś życie. - Bob Gilmore
Zawsze mnie przeraża, dlaczego "klon" nie jest w sensie dokładnej kopii. Jeśli jest to dokładny klon, czy wszystkie gałęzie nie powinny być częścią lokalnego repozytorium? Chodzi mi o to, czy to nie jest jeden z punktów dystrybucji? Więc kiedy coś jest w repozytorium, wciąż masz kompletną kopię wszystkiego. A może tak zwany "zdalny" jest już częścią lokalnego repozytorium? - huggie
Widząc wszystkie przeboje, odpowiedzi, komentarze na temat odpowiedzi i oszałamiającą liczbę wyświetleń, myślę, że to czas gita dodał polecenie, aby to zrobić. I prawda, że ​​jesteś @huggie, dokładnie moje myśli. - Sнаđошƒаӽ


Odpowiedzi:


Najpierw sklonuj pilota Git repozytorium i Płyta CD w tym:

$ git clone git://example.com/myproject
$ cd myproject

Następnie spójrz na lokalne gałęzie w twoim repozytorium:

$ git branch
* master

Ale w twoim repozytorium kryją się inne gałęzie! Możesz zobaczyć te przy użyciu -a flaga:

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental

Jeśli chcesz tylko rzucić okiem na oddział firmy, możesz to sprawdzić bezpośrednio:

$ git checkout origin/experimental

Jeśli jednak chcesz pracować w tej branży, musisz utworzyć lokalny oddział śledzenia, który zostanie wykonany automatycznie przez:

$ git checkout experimental

i zobaczysz

Branch experimental set up to track remote branch experimental from origin.
Switched to a new branch 'experimental'

Ta ostatnia linia rzuca niektórych ludzi: "Nowa gałąź" - huh? Oznacza to, że gałąź jest pobierana z indeksu i tworzona lokalnie. The poprzedni linia jest w rzeczywistości bardziej informatywna, ponieważ informuje, że gałąź jest skonfigurowana do śledzenia odległej gałęzi, co zwykle oznacza gałąź origin / nazwa_grupy

Teraz, jeśli spojrzysz na swoje lokalne oddziały, zobaczysz:

$ git branch
* experimental
  master

Możesz właściwie śledzić więcej niż jedno zdalne repozytorium git remote.

$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental
  remotes/win32/master
  remotes/win32/new-widgets

W tym momencie sprawy stają się szalone, więc uciekaj gitk aby zobaczyć, co się dzieje:

$ gitk --all &

4024
2017-09-16 13:28



Jak ktoś może automatycznie tworzyć wszystkie odległe oddziały, np. eksperymentalny z pochodzenia / eksperymentalny? - Cristian Ciupitu
Cristian: Zawsze tworzyłem gałąź 'foo' dla każdej gałęzi 'origin / foo', ale to doprowadziło do dwóch problemów: (1) Kończyłem z wieloma naprawdę nieczytelnymi gałęziami śledzenia, które były dużo razy za odpowiednim oddziałem zdalnym i (2) w starszych wersjach git, uruchomienie 'git push' usiłowało przenieść wszystkie moje lokalne gałęzie do zdalnego, nawet jeśli te gałęzie były nieaktualne. Więc teraz tylko utrzymuję lokalne oddziały dla rzeczy, które aktywnie rozwijam i uzyskuję bezpośredni dostęp do gałęzi origin / *, jeśli potrzebuję informacji na ich temat. (Powiedziałeś, że możesz użyć skryptu powłoki, aby przeanalizować "gałąź git -a".) - emk
"git fetch <origin-name> <nazwa-oddziału>" powoduje, że oddział jest lokalnie niedostępny. - Orange Box
Dobra odpowiedź, ale trochę tęskni za pytaniem. Szukałem jednego liniowca, by sprawdzić wszystkie odległe oddziały. - cmcginty
Pytanie dotyczyło klonowania wszystkich odległych gałęzi, a nie ich sprawdzania. I, jak zauważyłem powyżej, naprawdę nie chcesz tworzyć żadnych lokalnych oddziałów śledzących, niż to konieczne, ponieważ kiedy stają się naprawdę nieaktualne, mogą powodować bóle głowy. - emk


Jeśli masz wiele odległych gałęzi, które chcesz pobrać od razu, wykonaj następujące czynności:

$ git pull --all

Teraz możesz sprawdzić dowolny oddział, jak chcesz, bez uderzania w zdalne repozytorium.


745
2018-01-13 16:42



Jeśli zrobię klon git, mam lokalny oddział i 10 gałęzi "zdalnych". Więc ta odpowiedź Gabe była bardzo pomocna i odpowiada na pytanie. - basZero
to tylko pobiera odległe gałęzie, które zostały lokalnie dodane nie każdy zdalny oddział - jujule
Pierwsze polecenie jest zbędne. Po prostu git pull --all zrobi to samo - po prostu nie zabierze dwa razy. A infosec812 ma rację, to i tak nie odpowiada na pytanie. Zastanawiam się, skąd wzięło się tyle przebojów. - Sven Marnach
Po tym git remote update, a następnie próbował git branchWidzę tylko lokalne oddziały. Ale jeśli tak zrobię git branch -a Teraz widzę odległe gałęzie i mogę zrobić git pull <branchname> zdobyć gałąź, którą chcę. - Wylądowałem na to pytanie z wyszukiwarki Google, a ta odpowiedź rozwiązuje mój problem. - Jazzerus
To wcale nie jest pomocne, nie pociąga za sobą żadnych zdalnych gałęzi, poza istniejącymi. - Avinash R


To Grzmotnąć skrypt pomógł mi:

#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
    git branch --track "${branch##*/}" "$branch"
done

Utworzy on gałęzie śledzenia dla wszystkich odległych gałęzi, z wyjątkiem master (który prawdopodobnie otrzymałeś z oryginalnego polecenia clone). Myślę, że nadal możesz potrzebować

git fetch --all
git pull --all

być pewnym.

Jedna wkładka: git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs Jak zwykle: przetestuj swoją konfigurację przed skopiowaniem wszechświata rm -rf, jaki znamy

Kredyty dla jednej linijki trafiają do użytkownika cfi


379
2018-01-21 02:18



Jest to naprawdę bliskie bycia doskonałym rozwiązaniem. Jedyną rzeczą, która by to poprawiła, jest to, czy ta funkcjonalność została wbudowana jako opcja w git. - Deven Phillips
"Jeden liniowiec": git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs   Jak zwykle: przetestuj konfigurację przed kopiowaniem rm -rf universe as we know it - cfi
To polecenie tworzy gałęzie elementów ze zdalnego jako normalne gałęzie (nieobsługiwane gałęzie) - jak to naprawić? - Alex2php
jeśli napotkasz problemy z "/" w nazwach gałęzi, poniżej znajdziesz rozwiązanie wykorzystujące alias git. zobacz odpowiedź "nikt" na "Odpowiedzi 15 maja 13 o 11:02" - wemu
Właśnie przycinam remotes/origin/ w celu zachowania przestrzeni nazw: for BRANCH in $(git branch -a | grep remotes | grep -v HEAD | grep -v master); do git branch --track "${BRANCH#remotes/origin/}" "${BRANCH}"; done - kgadek


Używając --mirror opcja wydaje się skopiować remote właściwie śledzenie oddziałów. Jednak ustawia repozytorium jako repozytorium, więc musisz je później przywrócić do normalnego repozytorium.

git clone --mirror path/to/original path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout anybranch

Odniesienie: Git FAQ: Jak sklonować repozytorium ze wszystkimi zdalnie śledzonymi gałęziami?


280
2017-08-27 17:49



Wiesz, że to wygląda na całkiem dobrą odpowiedź, mimo że nie ma głosów. Czy są jakieś pułapki, aby to zrobić w ten sposób? Musiałem jawnie wyewidencjonować oddział po uruchomieniu tych poleceń. - loop
To w połączeniu z git push - mirror są dokładnie tym, czego potrzebowałem, aby stworzyć dokładny duplikat zdalnego repozytorium git podczas przejścia z github.com na instalację Github Enterprise. Dzięki! - Jacob Fike
@Dave: Dodaj finał git checkout jako ostatnie polecenie, by w końcu skasować szefa obecnego oddziału na sklonowanym repo. To jest świetna odpowiedź, zdecydowanie najlepsza. Bądź odważny, w końcu doprowadzimy Cię na szczyt :-) - cfi
@Dave: Hm. Zastanawiam się: --mirror nie tylko ustawia wszystkie gałęzie jako śledzone. Kopiuje wszystkie dokumenty dotyczące pochodzenia i następnych git remote update zrobię to jeszcze raz. Zachowanie zmian ciągnięcia. Wróciłem do przekonania, że ​​pełna kopia wymaga skryptu w jednym wierszu. - cfi
git clone --mirror jest bardzo dobry do tworzenia kopii zapasowych repozytoriów git ^ _ ^ - TrinitronX


Możesz łatwo przełączyć się do gałęzi bez użycia fantazyjnej składni "git checkout -b somebranch origin / somebranch". Możesz po prostu zrobić:

git checkout somebranch

Git automatycznie zrobi to, co trzeba:

$ git checkout somebranch
Branch somebranch set up to track remote branch somebranch from origin.
Switched to a new branch 'somebranch'

Git sprawdzi, czy gałąź o tej samej nazwie istnieje w dokładnie jednym zdalnym, a jeśli tak, to śledzi to w taki sam sposób, jakbyś wyraźnie określił, że jest to gałąź zdalna. Na stronie man git-checkout w Git 1.8.2.1:

Jeśli <gałąź> nie zostanie znaleziona, ale istnieje gałąź śledzenia w   dokładnie jeden pilot (nazwij go <zdalnie>) o pasującej nazwie, traktuj jako   równoważny

$ git checkout -b <branch> --track <remote>/<branch>

204
2018-05-12 12:11



Tak więc, jeśli nazwa oddziału ciebie checkout jest identyczne z nazwą odległej gałęzi, wszystko po "/", a następnie git utworzy gałąź o tej samej nazwie, wszystko po "/", "śledzeniu" tego zdalnego? A przez śledzenie rozumiemy: git push, git pullitp. zostanie wykonane na tym zdalnym? Jeśli jest to poprawne, rozwiń swoją odpowiedź, podając więcej informacji, ponieważ zgadzam się z @Daniel, ta odpowiedź zasługuje na więcej powtórzeń. - Gerard Roche
@BullfrogBlues, odpowiedź na wszystkie twoje pytania wydaje się być tak (używam git v1.7.7.4). Zgadzam się, że to zachowanie powinno być lepiej znane. (To nie jest w podręczniku dla tej wersji git.) Właściwie to nie lubię tego zachowania, wolę błąd i muszę powiedzieć git checkout --track origin/somebranch wyraźnie. - dubiousjim
@dubiousjim: Właściwie to jest w instrukcji. git-checkout (1) mówi: "Jeśli <branch> nie zostanie znaleziony, ale istnieje gałąź śledząca w dokładnie jednym zdalnym (nazwij to <remote>) z pasującą nazwą, traktuj jako odpowiednik 'git checkout -b <branch > --track <remote> / <branch> '"(Git V.1.8.1.1). - sleske
Potrzebujemy $ git pull * <remote> / * - gdzie "*" jest symbolem wieloznacznym, więc ciągnie wszystkie gałęzie, w tym te, które jeszcze nie są w systemie lokalnym. Jak to zrobić? Czy naprawdę powinniśmy kasa / wyciągnąć każdą gałąź tylko po to, aby kod został pobrany do naszego lokalnego systemu? - JosephK


Jeżeli chodzi o,

$ git checkout -b eksperymentalne pochodzenie / eksperymentalne

za pomocą

$ git checkout -t origin/experimental

lub bardziej gadatliwy, ale łatwiejszy do zapamiętania

$ git checkout --track origin/experimental

może być lepszy pod względem śledzenia zdalnego repozytorium.


88
2017-07-27 06:10





Pobieranie, które robisz, powinno uzyskać wszystkie zdalne gałęzie, ale nie będzie dla nich tworzyć lokalnych oddziałów. Jeśli używasz gitk, powinieneś zobaczyć odległe gałęzie opisane jako "remote / origin / dev" lub coś podobnego.

Aby utworzyć lokalny oddział w oparciu o zdalny oddział, wykonaj następujące czynności:

git checkout -b dev refs / remote / origin / dev

Które powinno zwrócić coś takiego:

Branch dev skonfigurowany do śledzenia zdalnych gałęzi refs / remote / origin / dev.
Przełączono do nowej gałęzi "dev"

Teraz, gdy jesteś w gałęzi dev, "git pull" zaktualizuje twój lokalny dev do tego samego punktu, co zdalna gałąź dev. Zwróć uwagę, że pobierze wszystkie gałęzie, ale tylko pociągnie tę, na której jesteś, do góry drzewa.


77
2017-09-15 22:52



Nie potrzebujesz tutaj refs / pilotów. git checkout -b dev origin / dev działa dobrze. - emk
To zawsze będzie działać: git checkout -b newlocaldev --track origin/dev. Jeśli chcesz, aby lokalny oddział miał taką samą nazwę jak zdalny, a zdalny nie ma trudnej nazwy, możesz pominąć -b newlocaldev. Z ustawieniem domyślnym branch.autosetupmerge konfiguracja i zakładając, że nie masz lokalnego oddziału o nazwie devTe dwa polecenia mogą robić to samo: git checkout -b dev origin/dev i po prostu git checkout dev. Wreszcie, git checkout origin/dev nie tworzy nowego oddziału, ale po prostu umieszcza cię w stanie odłączenia HEAD. - dubiousjim
Co dzieje się, gdy pilot już nie istnieje, ale Git jest zbyt głupi, aby potwierdzić jego usunięcie? Zakłada to, że jesteś zaktualizowany i git branch -a nadal wyświetla listę jako zdalną gałąź. - jww
I robimy to dla dziesiątek oddziałów? - JosephK


Kiedy wykonujesz polecenie "git clone git: // location", wszystkie gałęzie i znaczniki są pobierane.

Aby pracować nad określonym zdalnym oddziałem, zakładając, że jest on zdalny:

git checkout -b branch origin/branchname

57
2017-09-15 22:47



Doceniam twoją notatkę "wszystkie gałęzie i znaczniki są pobierane". Miałem zamiar skomentować odpowiedź, która była błędna, ale potem ją sprawdziłem i znalazłem, że masz całkowitą rację. W pewnym sensie podałeś najkrótszą odpowiedź - jeśli sklonowałeś, już ją masz. Miły. Można spróbować dodać: spróbuj $ git branch -a dowiedzieć się, jakie zdalne gałęzie są już dostępne. - Jan Vlcinsky