git pull all branches from remote repozytorium

Jak ściągnąć wszystkie zdalne gałęzie do własnego repozytorium?

Jeśli wpiszę:

git branch -a

Dostaję długą listę gałęzi, ale jeśli wpiszę:

git branch 
Widzę tylko 2 z nich.

Jak ściągnąć wszystkie gałęzie do mojej listy lokalnej?

I know I can do:

git checkout --track origin/branch-name
Ale to wyciąga i sprawdza tylko jedną gałąź na raz. Każdy sposób, aby zrobić to wszystko na raz bez tej całej żmudnej pracy z uruchomieniem git checkout --track pochodzenie / nazwa gałęzi w kółko i w kółko?

Ps. Próbowałem wykonywać polecenia, żadne z nich nie sprawiło, że zdalne gałęzie pojawiły się na mojej liście git branch :

git fetch --all
git remote update
git pull --all
Author: MarcinWolny, 2013-09-19

4 answers

Komenda, której zwykle używam do tworzenia widocznych gałęzi w górę i śledzenie ich jest opisane w "śledzenie wszystkich zdalnych gałęzi git jako lokalnych gałęzi":

remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/[^\/]+\//,"",$1); print $1}'`; do git branch --set-upstream-to $remote/$brname $brname ; done

Lub:

remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/[^\/]+\//,"",$1); print $1}'`; do git branch --track $brname $remote/$brname  ; done

Dla większej czytelności:

remote=origin ; // put here the name of the remote you want
for brname in `
  git branch -r | grep $remote | grep -v master | grep -v HEAD 
  | awk '{gsub(/[^\/]+\//,"",$1); print $1}'
`; do 
  git branch --set-upstream-to $remote/$brname $brname; 
  # or
  git branch --track $brname  $remote/$brname ; 
done

Drugi służy do tworzenia nowych lokalnych gałęzi śledzących zdalne gałęzie.

 13
Author: VonC,
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 10:31:09

Przeczytaj np. to Wyjaśnienie http://git-scm.com/book/en/Git-Branching-Remote-Branches

Najpierw wyjaśnijmy jakąś terminologię Gita:

    [14]} fetch: pobieranie zawartości (lub aktualizacji) ze zdalnego repo
  • pull: fetch (jak wyżej) i scal w jednym kroku

Oryginalny plakat nie wspomniał o scalaniu, więc chyba w odpowiedniej terminologii Gita być może chciał nawet zapytać "git fetch all branch from remote repozytorium"

Jeśli widzisz gałęzie w git branch -a to już je pobrałeś. Możesz to sprawdzić, podając komendę git show remotes/origin/some-branch:some-file

Lub może zrobić np. git diff remotes/origin/some-branch master

Możesz nawet je sprawdzić git checkout remotes/origin/some-branch

(aby mieć pewność, że możesz usunąć kabel sieciowy, a zobaczysz, że polecenia działają bez kontaktowania się ze zdalnym repo.)

Gałęzie nazwane piloty/... są nazywane odległymi gałęziami, ale są już pobierane do twojego repo. Są tylko do odczytu, nie można ich modyfikować (dlatego wiadomość pojawia się podczas wymeldowania). Chociaż odzwierciedlają one stan zdalnego repo w czasie ostatniej operacji pobierania lub pobierania, są w rzeczywistości przechowywane lokalnie.

Jeśli wykonasz git checkout some-branch i nie istnieje jeszcze jakaś gałąź, ale istnieje remotes / origin/ some-branch, git utworzy dla Ciebie gałąź śledzącą o nazwie some-branch (1). Ponownie jest to operacja lokalna, wszystkie dane zostały pobrane wcześniej (lub jeśli nie zostały pobrane ostatnio, zaczniesz pracować nad przestarzałą wersją). Pierwotnie zawartość gałęzi śledzącej jest identyczna z jej odległą gałęzią. Jednak gałąź śledzenia może być modyfikowana lokalnie.

Obszar roboczy git zawiera stan jednej gałęzi w czasie. Więc twoje pytanie o sprawdzenie wszystkich zdalnych gałęzi na raz nie ma sensu w kontekście Gita. Możecie je sprawdzić jeden po drugim. Ale za każdym razem, gdy sprawdzasz następny, poprzedni zniknie z obszaru roboczego. Oczywiście operacja ta może być skryptowany jak pokazano w śledzi wszystkie zdalne gałęzie git jako lokalne gałęzie ale jaki jest sens tworzenia skryptów dla operacji masowych, jeśli pozostaje tylko jej ostatni krok?

Więc pytanie może być spowodowane nieporozumieniem, zakładając, że zdalne gałęzie będą przechowywane tylko zdalnie, ale nie lokalnie i po prostu chcesz się upewnić, że masz wszystko lokalne? Jeśli naprawdę chcesz mieć więcej niż jedną gałąź sprawdzane w czasie można klon repo lokalnie i kasy różne gałęzie w różnych obszarach pracy. (2)

Krótko : jeśli chcesz mieć pewność, że masz wszystkie dane dostępne lokalnie, które są w remote repo wystarczy użyć git fetch [repo]. Jeśli nie poprawiłeś swojej konfiguracji, spowoduje to pobranie wszystkich gałęzi, tzn. zaktualizuje istniejące zdalne gałęzie, a także utworzy nowe, jeśli ma to zastosowanie.

(1) jest to prawdą w prostych standardowych przypadkach. W bardziej skomplikowanych przypadkach z więcej niż 1 pilotem lub ręcznie skonfigurowane piloty może być potrzebna opcja --track, aby dokładnie określić, co chcesz.

(2) istnieje nowa funkcja git worktree dla tego przypadku użycia. Jednak od początku 2018 roku jest nadal oznaczony jako experimental

 17
Author: Uwe Geuder,
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-05-03 22:24:52

Powinieneś Spróbować Czegoś Takiego: -

$ git fetch --all
$ for branch in `git branch -r | cut -d '/' -f2` ; do git checkout $branch && git pull origin $branch ; done
 2
Author: Mr. Pundir,
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-03 12:18:43

Zawsze używałem tego i działa idealnie

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all
 0
Author: pixel 67,
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-03-16 11:29:18