it-swarm.com.de

Verfolgen Sie alle Remote-Git-Zweige als lokale Zweige

Das Verfolgen einer einzelnen Zweigstelle als lokale Zweigstelle ist unkompliziert. 

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

Das Verschieben aller lokalen Zweigstellen zur Remote-Station und das Erstellen neuer Remote-Zweigstellen nach Bedarf ist ebenfalls einfach.

$ git Push --all Origin

Ich möchte das Gegenteil tun. Wenn ich X Fernzweige an einer einzigen Quelle habe: 

$ git branch -r 
branch1
branch2
branch3
.
.
.

Kann ich lokale Nachverfolgungszweige für alle diese entfernten Zweige erstellen, ohne sie manuell erstellen zu müssen? Sag so etwas wie:

$ git checkout --track -b --all Origin

Ich habe gegoogelt und RTMs, bin aber bis jetzt bunk hochgekommen. 

151
Janson

Die Antwort von Otto ist gut, aber alle erstellten Zweige werden mit "Ursprung /" am Anfang des Namens stehen. Wenn Sie nur den letzten Teil (nach dem letzten /) als resultierenden Zweignamen verwenden möchten, verwenden Sie diesen Befehl:

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

Es hat auch den Vorteil, dass Sie keine Warnungen vor mehrdeutigen Verweisen geben.

181
tjmcewan

Hier ist mein Einzeiler, den ich benutze (in einer Bash-Shell, getestet mit msysgit1.7.4):

Zum Kopieren und Einfügen:

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

Für mehr Lesbarkeit:

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
  • es wählt nur Upstream-Zweige aus der von Ihnen angegebenen Fernbedienung in der Variable remote aus (es kann sich dabei um 'Origin' oder um einen beliebigen Namen handeln, den Sie für eine der Fernbedienungen Ihres aktuellen Git-Repos festgelegt haben).
  • es extrahiert den Namen des Zweigs: Origin/a/Branch/Name => a/Branch/Name durch den Ausdruck awk.
  • es wird den Upstream-Zweig durch --set-upstream-to (oder -u) setzen, nicht --track:
    Der Vorteil ist, dass, wenn der Zweig bereits vorhanden ist, kein Fehler auftritt und dieser Zweig Ursprung nicht geändert wird, dass nur die Einstellung branch.xxx.(remote|merge) konfiguriert wird.

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

Dieser Befehl erstellt lokale Verzweigungen für alle entfernten Upstream-Zweige und legt deren Remote- und Merge-Einstellung für diesen entfernten Zweig fest.

21
VonC

Die meisten Antworten hier machen die Analyse der Ausgabe von git branch -r zu kompliziert. Sie können die folgende for-Schleife verwenden, um die Verfolgungszweige gegen alle Zweige auf der entfernten Seite zu erstellen.

Beispiel

Angenommen, ich habe diese abgelegenen Zweige.

$ git branch -r
  Origin/HEAD -> Origin/master
  Origin/development
  Origin/integration
  Origin/master
  Origin/production
  Origin/staging

Vergewissern Sie sich, dass wir vor Ort nichts anderes als Master verfolgen:

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

Sie können diesen einen Liner verwenden, um die Tracking-Zweige zu erstellen:

$ 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.

Bestätigen Sie jetzt:

$ git branch
  development
  integration
* master
  production
  staging

Um sie zu löschen:

$ 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).

Wenn Sie den Code -vv zu git branch verwenden, können Sie Folgendes bestätigen:

$ 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 ....

Aufschlüsselung der for-Schleife

Die Schleife ruft grundsätzlich den Befehl git branch -r auf und filtert alle HEAD - oder Master-Zweige in der Ausgabe mit grep -vE "HEAD|master" heraus. Um nur die Namen der Zweige abzüglich des Origin/-Teilstrings zu erhalten, verwenden wir die String-Manipulation von Bash ${var#stringtoremove}. Dadurch wird die Zeichenfolge "stringtoremove" aus der Variablen $var entfernt. In unserem Fall entfernen wir den String Origin/ aus der Variablen $i.

NOTE: Alternativ können Sie auch git checkout --track ... verwenden:

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

Aber diese Methode interessiert mich nicht besonders, da Sie zwischen den Filialen wechseln, während sie eine Kaufabwicklung durchführen. Wenn Sie fertig sind, bleibt der zuletzt erstellte Zweig erhalten.

Verweise

19
slm

Man könnte so leicht ein Skript schreiben, aber ich weiß nicht, wann es wertvoll ist. Diese Zweige würden ziemlich schnell zurückfallen, und Sie müssten sie ständig aktualisieren.

Die entfernten Zweigstellen werden automatisch auf dem neuesten Stand gehalten. Daher ist es am einfachsten, die lokale Zweigstelle an dem Punkt zu erstellen, an dem Sie tatsächlich daran arbeiten möchten.

12
Dustin
for i in `git branch -a | grep remote`; do git branch --track ${i#remotes/Origin/} $i; done
8
Val Blant

ohne Scripting (in einem leeren Verzeichnis):

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

danach werden alle entfernten Zweige als lokal betrachtet.


original (in russisch) .

6

Wenn Sie Powershell verwenden möchten und Ihre Fernbedienung als Origin bezeichnet wird. Dann funktioniert das.

git fetch    
git branch -r  | %{$_ -replace "  Origin/"} | %{git branch --track $_ "Origin/$_"}
4
BigMiner

Hier ist meine Lösung des BASH-Befehls, der von @tjmcewan referenziert wird:

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

Mein Ziel ist es, das Problem zu lösen, dass alle erstellten Verzweigungen mit "Origin /" beginnen, da ich getestet habe, dass $ remote-Variablen immer noch "Origin /" enthalten:

for remote in `git branch -r | grep -v /HEAD`; do echo $remote ; done
3
Nick Tsai
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do  git branch --track ${branch##*/} $branch; done

Verwenden Sie diese Option, um keine Warnung zu erhalten: refname 'Origin/dev' ist mehrdeutig

3
bruziuz

Um dasselbe zu tun wie tjmcewans Antwort , aber unter Windows rufen Sie dies aus einer batch-Datei auf:

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

Oder dies von der Befehlszeile:

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

Falls Sie bereits einige Filialen ausgecheckt haben und möchten

  • checken Sie alle verbleibenden Filialen von der Fernbedienung aus
  • stellen Sie sicher, dass alle lokalen Niederlassungen die entfernten Niederlassungen verfolgen

sie können das folgende bash- und zsh-kompatible Skript verwenden:

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
simonair

Mit bash Wenn Sie alle Zweige auschecken möchten:

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

Beachten Sie, dass Sie beim Abrufen neuer Remote-Tracking-Zweige nicht automatisch über lokale, bearbeitbare Kopien verfügen.

0
Jason Chen
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

Erläuterung:

zeile 1: 'git branch -r' (gefolgt von 'git remote update' zum Aktualisieren der Informationen zu Änderungen an remote) listet alle Remote-Zweige auf; 'egrep -vw' wird verwendet, um Einträge mit HEAD und Master im Ergebnis zu schlagen.

zeile 3: Verfolgen Sie den benannten entfernten Zweig, während Sie ihn lokal auschecken. Ein einfaches awk wird verwendet, um zu vermeiden, dass "Origin /" das Suffix für lokale Zweigstellen ist. 

0
ksvrgh