Śledzenie wszystkich zdalnych gałęzi git jako lokalnych gałęzi

Śledzenie pojedynczego zdalnego oddziału jako lokalnego oddziału jest wystarczająco proste.

$ git checkout --track -b ${branch_name} origin/${branch_name}

Przesuwanie wszystkich lokalnych gałęzi do zdalnego, tworzenie nowych zdalnych gałęzi w razie potrzeby jest również łatwe.

$ git push --all origin
Chcę zrobić odwrotnie. Jeśli mam X liczbę zdalnych gałęzi w jednym źródle:
$ git branch -r 
branch1
branch2
branch3
.
.
.

Czy mogę utworzyć lokalne gałęzie śledzące dla wszystkich tych zdalnych gałęzi bez konieczności ręcznego tworzenia każdej z nich? Powiedz coś w stylu:

$ git checkout --track -b --all origin
Wygooglowałem i RTMs, / align = "left" /
 146
Author: Janson, 2008-12-18

14 answers

Using bash:

po git 1.9.1
for i in `git branch -a | grep remote | grep -v HEAD | grep -v master`; do git branch --track ${i#remotes/origin/} $i; done

Napisy: Val Blant, elias i Hugo

przed git 1.9.1

Uwaga: poniższy kod, jeśli zostanie użyty w późniejszych wersjach git (>v1.9.1) powoduje

  1. (bug) wszystkie utworzone gałęzie do śledzenia master
  2. (3) wszystkie utworzone nazwy lokalnych gałęzi mają być poprzedzone origin/
for remote in `git branch -r `; do git branch --track $remote; done

Zaktualizuj gałęzie, zakładając, że nie ma zmian na Twoje lokalne oddziały śledzenia:

for remote in `git branch -r `; do git checkout $remote ; git pull; done

Ignoruj niejednoznaczne Ostrzeżenia refname, git wydaje się preferować lokalną gałąź tak, jak powinna.

 84
Author: Otto,
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-25 18:47:48

ODPOWIEDŹ dana przez Otto jest dobra, ale wszystkie utworzone gałęzie będą miały "pochodzenie/" jako początek nazwy. Jeśli chcesz, aby ostatnia część (po ostatnim/) była wynikowymi nazwami gałęzi, użyj tego:

for remote in `git branch -r | grep -v /HEAD`; do git checkout --track $remote ; done

Ma również tę zaletę, że nie daje żadnych ostrzeżeń o niejednoznacznych refach.

 177
Author: tjmcewan,
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-12 11:25:38

Oto mój jednowarstwowy, którego używam (w powłoce bash, testowanej z msysgit1.7. 4):

Dla copy-paste:

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

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; 
done
  • wybierze tylko odgałęzienia z pilota, który podasz w zmiennej remote (może to być 'origin ' lub inna nazwa, którą ustawiłeś dla jednego z pilotów Twojego obecnego repo).
  • wyodrębni nazwę gałęzi: origin/a/Branch/Name => a/Branch/Name poprzez wyrażenie awk.
  • Ustawi upstream branch through --set-upstream-to (or -u), Nie --track:
    Zaletą jest to, że jeśli gałąź już istnieje, nie zawiedzie się i nie zmieni jej pochodzenia, tylko skonfiguruje ustawienie branch.xxx.(remote|merge).

    branch.aBranchName.remote=origin
    branch.aBranchName.merge=refs/heads/a/Branch/Name
    

To polecenie utworzy lokalne gałęzie dla wszystkich odległych gałęzi i ustawi ich ustawienia zdalne i Scal do tej zdalnej gałęzi.

 21
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 11:47:08

Większość odpowiedzi tutaj jest zbyt skomplikowana, aby parsować wyjście git branch -r. Możesz użyć następującej pętli for, aby utworzyć gałęzie śledzące względem wszystkich gałęzi na pilocie w ten sposób.

Przykład

Powiedzmy, że mam te odległe gałęzie.
$ git branch -r
  origin/HEAD -> origin/master
  origin/development
  origin/integration
  origin/master
  origin/production
  origin/staging

Potwierdź, że nie śledzimy już niczego innego niż master, lokalnie:

$ git branch -l    # or using just git branch
* master

Możesz użyć tego linera do utworzenia gałęzi śledzenia:

$ for i in $(git branch -r | grep -vE "HEAD|master"); do 
    git branch --track ${i#*/} $i; done
Branch development set up to track remote branch development from origin.
Branch integration set up to track remote branch integration from origin.
Branch production set up to track remote branch production from origin.
Branch staging set up to track remote branch staging from origin.

Teraz confirm:

$ git branch
  development
  integration
* master
  production
  staging

Aby je usunąć:

$ git br -D production development integration staging 
Deleted branch production (was xxxxx).
Deleted branch development (was xxxxx).
Deleted branch integration (was xxxxx).
Deleted branch staging (was xxxxx).

Jeśli użyjesz przełącznika -vv na git branch możesz potwierdzić:

$ git br -vv
  development xxxxx [origin/development] commit log msg ....
  integration xxxxx [origin/integration] commit log msg ....
* master      xxxxx [origin/master] commit log msg ....
  production  xxxxx [origin/production] commit log msg ....
  staging     xxxxx [origin/staging] commit log msg ....

Podział pętli for

Pętla zasadniczo wywołuje polecenie git branch -r, filtrując dowolne gałęzie HEAD lub master na wyjściu za pomocą grep -vE "HEAD|master". Aby uzyskać nazwy tylko gałęzi minus podciąg origin/ używamy manipulacji łańcuchami Basha ${var#stringtoremove}. Spowoduje to usunięcie łańcucha "stringtoremove"ze zmiennej $var. W naszym przypadku usuwamy string origin/ ze zmiennej $i.

Uwaga: Alternatywnie możesz użyć git checkout --track ..., aby to zrobić:

$ for i in $(git branch -r | grep -vE "HEAD|master" | sed 's/^[ ]\+//'); do 
    git checkout --track $i; done

Ale nie dbam szczególnie o tę metodę, ponieważ przełącza cię między gałęziami, gdy wykonuje zamówienie. Kiedy to zrobi, zostawi cię na ostatniej gałęzi, którą stworzył.

Referencje

 19
Author: slm,
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-12-01 18:43:27

Można by tak łatwo napisać, ale nie wiem kiedy to będzie wartościowe. Te gałęzie dość szybko zostałyby w tyle, a Ty musiałbyś je aktualizować cały czas.

Zdalne gałęzie będą automatycznie aktualizowane, więc najłatwiej jest utworzyć lokalną gałąź w miejscu, w którym chcesz nad nią pracować.

 12
Author: Dustin,
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
2008-12-18 20:48:39
for i in `git branch -a | grep remote`; do git branch --track ${i#remotes/origin/} $i; done
 8
Author: Val Blant,
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-05-07 21:14:17

Bez skryptów (w pustym katalogu):

$ git clone --bare repo_url .git
$ git config core.bare false
$ git checkout

Po tym, wszystkie odległe gałęzie będą postrzegane jako lokalne.


Oryginał (w języku rosyjskim) .

 4
Author: alexander barakin,
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-04-13 12:53:25
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do  git branch --track ${branch##*/} $branch; done

Użyj tego, a nie będziesz miał takiego ostrzeżenia jak: refname 'origin/dev' jest niejednoznaczne

 3
Author: bruziuz,
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
2013-01-21 05:17:02

Jeśli chcesz używać powershell i twój pilot nazywa się origin. Więc to działa.

git fetch    
git branch -r  | %{$_ -replace "  origin/"} | %{git branch --track $_ "origin/$_"}
 3
Author: BigMiner,
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-03-24 15:20:26

Oto moje rozwiązanie polecenia BASH odwołującego się do @tjmcewan:

for remote in `git branch -r | grep -v /HEAD `; do git branch --track ${remote/"origin/"/""}; done

Moim celem jest rozwiązanie problemu, że wszystkie utworzone gałęzie będą miały " origin / "jako początek nazwy, ponieważ testowałem, że zmienne $remote nadal zawierają"origin/":

for remote in `git branch -r | grep -v /HEAD`; do echo $remote ; done
 3
Author: Nick Tsai,
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-05 08:17:49

Aby zrobić to samo co odpowiedź tjmcewana ale w systemie Windows wywołaj to z pliku wsadowego:

for /f "delims=" %%r in ('git branch -r ^| grep -v master') do git checkout --track %%r

Lub to z linii poleceń :

for /f "delims=" %r in ('git branch -r ^| grep -v master') do git checkout --track %r
 2
Author: Hugo,
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:10:35

W przypadku, gdy masz już jakieś oddziały sprawdzone i chcesz

  • sprawdź wszystkie pozostałe gałęzie z pilota
  • Upewnij się, że wszystkie lokalne gałęzie śledzą odległe gałęzie

Możesz użyć następującego skryptu zgodnego z bash i zsh:

git branch -r | while read b; do if git branch | grep -q " ${b##*/}$"; then git branch --set-upstream ${b##*/} $b; else git branch --track ${b##*/} $b; fi; done
 0
Author: simonair,
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
2012-06-26 10:19:55
for rembranch in `git remote update 2>&1 > /dev/null ; git branch -r|egrep -wv "HEAD|master"`
do 
    git checkout --track -b `echo $rembranch|awk -F\/ '{print $2}'` $rembranch; 
done

Wyjaśnienie:

Linia 1: 'Git branch-r' (po której następuje 'Git remote update', aby zaktualizować informacje o zmianach na remote) wyświetla wszystkie zdalne gałęzie; 'egrep-vw' jest używany do strącania wpisów z HEAD i master w wyniku.

Linia 3: śledzenie nazwanej zdalnej gałęzi podczas sprawdzania jej lokalnie. Prosty awk jest używany, aby uniknąć przyrostka 'origin/' dla lokalnych gałęzi.

 0
Author: ksvrgh,
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
2013-10-15 11:57:55

Używanie bash, Jeśli chcesz sprawdzić wszystkie oddziały:

for remote in `git branch -r`; do git checkout $(echo $remote | cut -d'/' -f 2); done

Ważne jest, aby pamiętać, że gdy wykonujesz pobieranie, które sprowadza nowe gałęzie zdalnego śledzenia, nie masz automatycznie lokalnych, edytowalnych kopii tych gałęzi.

 0
Author: Jason Chen,
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-09-04 01:05:36