So rufen Sie alle Git-Zweige ab


1507

Ich habe ein Git-Repository geklont, das ungefähr fünf Zweige enthält. Wenn ich das tue, sehe git branchich jedoch nur einen von ihnen:

$ git branch
* master

Ich weiß , dass ich tun kann , git branch -aum zu sehen , alle die Zweige, aber wie würde ich alle die Zweige vor Ort so ziehen , wenn ich tun git branch, es zeigt die folgende?

$ git branch
* master
* staging
* etc...


2
Diese Frage zeigt, wie alle Zweige abgerufen werden, nachdem die --single-branchEinstellung beim Klonen verwendet wurde: stackoverflow.com/questions/17714159/… ( git fetch --allfunktioniert nie, wenn Sie nur einen Zweig angegeben haben!)
Matthew Wilcoxson

2
Sie werden diese Ausgabe nie sehen, da das Sternchen den Zweig darstellt, der gerade ausgecheckt wird. Da Sie nur eine Filiale gleichzeitig auschecken lassen können, können Sie links von Ihrer Filialliste nur ein Sternchen haben.
Robino

5
Ich habe viele Antworten gesehen, aber keine von ihnen erwähnte, was meiner Meinung nach der einfachste Weg ist, um das zu tun, was Sie wollen: git clone --bare <repo url> .git (Beachten Sie, dass Sie am Ende "--bare" und ".git" hinzufügen müssen, um das Repo als zu klonen "nacktes" Repo), dann git config --bool core.bare false(setzt das "nackte" Flag auf false), dann git reset --hard(verschiebt den KOPF auf den aktuellen KOPF im Repo). Wenn Sie git branchnun alle Zweige des von Ihnen geklonten Repos sehen sollten.
Gabriel Ferraz

4
@GabrielFerraz Dann missbrauchen Sie die Kommentarfunktion für Stack Overflow. Benutzer können Ihren Kommentar positiv, aber nicht negativ bewerten.
Pipe

Antworten:


2051

Sie können alle Zweige von allen Fernbedienungen wie folgt abrufen:

git fetch --all

Es ist im Grunde eine Kraftbewegung .

fetchaktualisiert lokale Kopien von Remote-Filialen, sodass dies für Ihre lokalen Filialen immer sicher ist, ABER :

  1. fetchaktualisiert keine lokalen Zweige (die entfernte Zweige verfolgen ); Wenn Sie Ihre lokalen Zweige aktualisieren möchten, müssen Sie dennoch jeden Zweig abrufen.

  2. fetchnicht schaffen lokale Niederlassungen (die Spur entfernte Niederlassungen), müssen Sie dies manuell tun. Wenn Sie alle Remote-Zweige auflisten möchten: git branch -a

So aktualisieren Sie lokale Zweige, die entfernte Zweige verfolgen:

git pull --all

Dies kann jedoch immer noch unzureichend sein. Es funktioniert nur für Ihre lokalen Niederlassungen, die entfernte Niederlassungen verfolgen. So verfolgen Sie alle entfernten Niederlassungen dieses oneliner ausführen VOR git pull --all :

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

TL; DR-Version

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

(Es scheint, dass Pull alle Zweige von allen Fernbedienungen abruft, aber ich hole immer zuerst, nur um sicherzugehen.)

Führen Sie den ersten Befehl nur aus, wenn sich auf dem Server Remote-Zweige befinden, die von Ihren lokalen Zweigen nicht verfolgt werden.

PS AFAIK git fetch --allund git remote updatesind gleichwertig.



Kamil Szots Kommentar , den die Leute nützlich fanden.

Ich musste verwenden:

for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done

weil Ihr Code lokale Zweige mit dem Namen erstellt hat origin/branchnameund ich "refname 'origin / branchname' erhalten habe, ist dies nicht eindeutig, wenn ich darauf verwiesen habe.


42
Es tut uns leid. Ich kann mir nicht vorstellen, dass das OP das wirklich will. Der Befehl 'Pull' lautet 'Fetch + Merge' und der Merge-Teil überlagert alle Zweige übereinander und hinterlässt ein riesiges Durcheinander.
GoZoner

10
Dieser Abruf würde keinen neuen Remote-Zweig erstellen, mit dem Sie ihn noch git checkout -b localname remotename/remotebranch
auschecken müssen

125
Ich musste verwenden, for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done weil Ihr Code lokale Zweige mit dem Namen origin / branchname erstellt hat und ich erhielt, dass "refname 'origin / branchname' nicht eindeutig ist, wenn ich darauf verwies.
Kamil Szot

22
Ich weiß nicht, ob ich eine andere Version von GIT verwende, aber ich musste das Skript ändern git pull --all; for remote in `git branch -r | grep -v \>`; do git branch --track ${remote#origin/} $remote; done. Durch die Änderung wird HEAD entfernt.
Kim3er

16
Für die Windows-Leute:for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all
Max

719

So listen Sie entfernte Zweige auf:
git branch -r

Sie können sie als lokale Niederlassungen auschecken mit:
git checkout -b LocalName origin/remotebranchname


88
Genau das habe ich gesucht, als ich die Frage oben gefunden habe. Ich vermute, dass viele Leute, die nach einer Möglichkeit suchen, einen Remote-Zweig abzurufen, den Zweig definitiv nicht in ihre aktuelle Arbeitskopie einbinden möchten, aber einen lokalen Zweig, der mit dem Remote-Zweig identisch ist.
Frug

12
Auch wenn der Zweig lokal nicht sichtbar ist, kann ich das git checkout remotebranchnameund es funktioniert. Was ist der Unterschied zu Ihrer Lösung?
François Romain

12
Sein Standardverhalten jetzt. War bei älteren Git-Versionen nicht der Fall. Mit git checkout remotebranchnameverwendet, um nur einen neuen, nicht verwandten Zweig mit dem Namen remotebranchname zu erstellen .
Learath2

12
Die akzeptierte Antwort macht etwas grundlegend anderes und um ehrlich zu sein, ich verstehe nicht einmal, warum es die akzeptierte Antwort ist
Learath2

8
Das OP bat um alle Filialen. Diese Antwort macht nur eine.
Ted Bigham

193

Sie müssen lokale Zweige erstellen, die entfernte Zweige verfolgen.

Angenommen, Sie haben nur eine Fernbedienung aufgerufen origin, erstellt dieses Snippet lokale Zweige für alle Fernverfolgungszweige:

for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

Danach git fetch --allwerden alle lokalen Kopien der Remote-Zweige aktualisiert.

Außerdem git pull --allwird Ihren lokalen Tracking - Zweig aktualisieren, aber abhängig von Ihrem lokalen Commits und wie die ‚merge‘ configure Option gesetzt ist , es könnte eine Zusammenführung schaffen begehen, Vorspulen oder scheitern.


5
Dies stabilisiert die Lösung gegen Verzweigungsnamen, die Shell-Metazeichen enthalten (gemäß Pinkeens Kommentar zur anderen Antwort), und vermeidet falsche Fehlerausgabe: git branch -r | grep -v - '->' | beim Lesen der Fernbedienung; do git branch --track "$ {remote # origin /}" "$ remote" 2> & 1 | grep -v 'existiert bereits'; fertig
Daira Hopwood

6
Sind Sie sicher, dass git pull --allalle lokalen Tracking-Zweige aktualisiert werden? Soweit ich das beurteilen kann, wird nur der aktuelle Zweig von allen Fernbedienungen aktualisiert.
Andy

3
Tat dies. Lokale Zweige, die mit entfernten Zweigen übereinstimmen, wurden nicht erstellt. Was ist der Befehl git, der einfach sagt: "Alle Remote-Zweige ziehen, um lokale zu erstellen, wenn sie nicht vorhanden sind?"
JosephK

@JosephK vielleicht heißt deine Fernbedienung nicht origin? Siehe diese Antwort, die für alle Remote-Namen funktioniert.
Tom Hale

@ TomHale Es war "Ursprung", aber danke für Ihre Antwort - obwohl verrückt, dass so viel notwendig ist, um das zu tun, was eine oder vielleicht zwei Flaggen sein sollten. Ich versuche jetzt gitless, um den Wahnsinn einiger Aspekte von git zu vermeiden.
JosephK

116

Wenn Sie tun:

git fetch origin

dann werden sie alle vor Ort sein. Wenn Sie dann ausführen:

git branch -a

Sie sehen sie als Fernbedienungen / Ursprung / Filialname. Da sie vor Ort sind, können Sie mit ihnen machen, was Sie wollen. Zum Beispiel:

git diff origin/branch-name 

oder

git merge origin/branch-name

oder

git checkout -b some-branch origin/branch-name

5
Habe gerade diese Seite bei Google gefunden ... das war die eigentliche Art der Antwort, die ich gesucht habe. Ich habe den ersten Befehl ausprobiert, aber eine Fehlermeldung erhalten: [$ git fetch --all origin fatal: fetch --all akzeptiert kein Repository-Argument] --- Die Verwendung von "git fetch --all" scheint den Trick zu tun. Danke für die Führung!
Longda

1
--all
Behoben

12
git fetch -allholt alle Zweige aller Fernbedienungen. git fetch originholt alle Zweige der Fernbedienung origin. Letzteres hat das OP gefragt.
GoZoner

3
--allbedeutet "alle Fernbedienungen", nicht "alle Zweige einer bestimmten Fernbedienung". Letzteres wird durch jeden Abruf von einer Fernbedienung impliziert.
Spacediver

2
Dies ist nicht die Möglichkeit, alle Zweige vom Remote-Repo in das lokale Repo zu ziehen.
Vladimir Despotovic

69
$ git remote update
$ git pull --all

Dies setzt voraus, dass alle Zweige verfolgt werden.

Wenn dies nicht der Fall ist, können Sie dies in Bash abfeuern:

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

Führen Sie dann den Befehl aus.


3
Wenn ich das versuche, bekomme ich immer noch das gleiche Ergebnis wie oben.
David542

4
Wie bei @JacobLowe habe ich den Fehler erhalten, aber es hat trotzdem funktioniert. 'fatal: Ein Zweig mit dem Namen' origin / master 'existiert bereits.'
AnneTheAgile

Dies ist hässlich, da versucht wird, einen Zweig zu erstellen, für ->den wahrscheinlich in der Ausgabe von git branch -r"origin / HEAD -> origin / master"
Tom Hale

Außerdem funktioniert es nicht. Ich erhalte eine Ausgabe: Branch 'origin/quote-filenames' set up to track local branch 'master'. Die gewünschte Ausgabe ist: Branch 'quote-filenames' set up to track remote branch 'quote-filenames' from 'origin'. Dies ist rückwärts , wobei der Ursprung für die Verfolgung der Fernbedienung festgelegt wird. In dieser Antwort finden Sie eine Lösung.
Tom Hale

genau das, was ich brauchte. Da ich den Mac gewechselt habe, konnte ich selbst nach dem Klonen des Repos keine anderen Remote-Zweige auschecken und git fetchfunktionierte nicht. Die Lektion hier ist also, dass Sie die entfernten Zweige verfolgen müssen. Gracias!
Victor Ramos

58

Die Bash- forSchleife funktionierte bei mir nicht, aber das tat genau das, was ich wollte. Alle Zweige meiner Herkunft wurden lokal als gleichnamig gespiegelt.

git checkout --detach
git fetch origin '+refs/heads/*:refs/heads/*'

Siehe Mike DuPonts Kommentar unten. Ich glaube, ich habe versucht, dies auf einem Jenkins-Server zu tun, der ihn im Modus mit getrenntem Kopf belässt.


6
Das ergibt sich fatal: Refusing to fetch into current branch refs/heads/master of non-bare repositorynach einem einfachen Klon. Müssen Kopf zuerst abnehmen. Ich tat dies mitgit checkout <SHA>
brannerchinese

6
Meine Lösung mit diesem ist git checkout --detach # detach the headund danngit fetch origin \'+refs/heads/*:refs/heads/*
Mike DuPont

1
Dieser hat bei mir funktioniert, außer dass ich auch den Parameter --tags verwende. Ich wünschte, es gäbe ein einfaches Standard-Frontend für Git. Die Anzahl der einfachen Dinge in Git, die mehr als 10 Stapelüberlaufantworten benötigen, ist lächerlich!
Kristianp

1
@kristianp Hast du Ungit oder GitKraken ausgecheckt?
Dragon788

@ dragon788 Ich habe SourceTree für eine Git-GUI verwendet, aber ich habe wirklich über eine einfachere Befehlszeile für Skriptaufgaben gesprochen.
Kristianp

51

Verwenden Sie git fetch && git checkout RemoteBranchName.

Es funktioniert sehr gut für mich ...


6
Dies ist die neue beste Antwort. Ich weiß nicht, ob dies vorher vielleicht nicht möglich war, aber neuere Versionen von Git werden zumindest feststellen, dass Sie versuchen, einen Remote-Zweig auszuchecken, und automatisch den lokalen Tracking-Zweig für Sie einrichten (und Sie brauchen ihn nicht) zu spezifizieren origin/branch, es genügt nur zu sagen branch).
Neil Traft

9
Dies beantwortet nicht die ursprüngliche Frage: "Wie würde ich alle Zweige lokal ziehen?" Es zieht sie einzeln, was nicht skalierbar ist.
Ingyhere

Dies war die einzige Antwort, die es mir ermöglichte, in jeder Situation, der ich begegnet bin, entfernte Zweige zu ziehen
Emmanuel Buckshi,

38

Wenn Sie ein Repository klonen, werden alle Informationen der Zweige tatsächlich heruntergeladen, aber die Zweige werden ausgeblendet. Mit dem Befehl

$ git branch -a

Sie können alle Zweige des Repositorys und mit dem Befehl anzeigen

$ git checkout -b branchname origin/branchname

Sie können sie dann einzeln manuell "herunterladen".


Es gibt jedoch einen viel saubereren und schnelleren Weg, obwohl er etwas kompliziert ist. Sie benötigen drei Schritte, um dies zu erreichen:

  1. Erster Schritt

    Erstellen Sie einen neuen leeren Ordner auf Ihrem Computer und klonen Sie eine Spiegelkopie des .git-Ordners aus dem Repository:

    $ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
    $ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git
    

    Das lokale Repository im Ordner my_repo_folder ist noch leer. Es gibt nur noch einen versteckten .git-Ordner, den Sie mit einem "ls -alt" -Befehl vom Terminal aus sehen können.

  2. Zweiter Schritt

    Wechseln Sie dieses Repository von einem leeren (nackten) Repository zu einem regulären Repository, indem Sie den booleschen Wert "bare" der Git-Konfigurationen auf false setzen:

    $ git config --bool core.bare false
    
  3. Dritter Schritt

    Holen Sie sich alles, was sich im aktuellen Ordner befindet, und erstellen Sie alle Zweige auf dem lokalen Computer. Dies macht dies zu einem normalen Repo.

    $ git reset --hard
    

Jetzt können Sie einfach den Befehl eingeben git branchund sehen, dass alle Zweige heruntergeladen wurden.

Dies ist die schnelle Methode, mit der Sie ein Git-Repository mit allen Zweigen gleichzeitig klonen können. Dies möchten Sie jedoch nicht für jedes einzelne Projekt auf diese Weise tun.


1
Upvoted für die Erwähnung von versteckten Zweigen. hat mir geholfen, die lokale Filialverfolgung immens zu verstehen.
mburke05

Es ist eine gute Antwort, aber die Frage impliziert etwas für den täglichen Gebrauch. Es ist nicht praktisch, das Repository jedes Mal zu klonen.
Z. Khullah

Warum werden beim Zurücksetzen alle Zweige lokal erstellt?
Z. Khullah

@ Z.Khullah Es ist nicht das Zurücksetzen, das alle Zweige erstellt, sondern der Klon - Spiegel. Leider entsteht dadurch auch ein nacktes Repo, was sich in den Schritten 2 und 3 ändert.
ScottJ

29

Sie können alle Zweige abrufen, indem Sie:

git fetch --all

oder:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

Der --depth=10000Parameter kann hilfreich sein, wenn Sie ein flaches Repository haben.


Verwenden Sie zum Ziehen aller Zweige:

git pull --all

Wenn dies nicht funktioniert, stellen Sie dem obigen Befehl Folgendes voran:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

da das remote.origin.fetchbeim Abrufen nur einen bestimmten Zweig unterstützen könnte, insbesondere wenn Sie Ihr Repo mit geklont haben --single-branch. Überprüfen Sie dies durch : git config remote.origin.fetch.

Danach sollten Sie in der Lage sein, jeden Zweig auszuchecken.

Siehe auch:


Verwenden Sie Folgendes, um alle Zweige auf die Fernbedienung zu übertragen:

git push --all

schließlich --mirroralle refs spiegeln.


Wenn Sie ein Repository duplizieren möchten, lesen Sie: Duplizieren eines Repository- Artikels bei GitHub.


1
Genial ... Ich habe alles andere vor Ihrer Lösung auf dieser Seite ausprobiert. Vielen Dank!
Sujoy

2
Ich habe flaches Klonen ( depth=1) verwendet und die Konfiguration hat auch einen bestimmten Zweig für angegeben fetch- der depth=1000Parameter war der Fix, der mir geholfen hat, einen bestimmten Remote-Zweig
Sandra

2
pull --allzieht nicht alle Zweige, sondern alle Fernbedienungen
Z. Khullah

Netter Trick mit der Konfiguration! Würde sie alle die ganze Zeit holen
Z. Khullah

Ich habe die Konfiguration überprüft, wie Sie geschrieben haben, funktioniert immer noch nur mit dem aktuellen Zweig. Sieht so aus, als ob alle Antworten hier nicht für mich funktionieren ...
Alexei Martianov

25

Normalerweise benutze ich nichts anderes als Befehle wie diesen:

git fetch origin
git checkout --track origin/remote-branch

Eine etwas kürzere Version:

git fetch origin
git checkout -t origin/remote-branch

17

Ich glaube, Sie haben das Repository geklont durch:

git clone https://github.com/pathOfrepository

Gehen Sie nun mit cd in diesen Ordner:

cd pathOfrepository

Wenn Sie tippen git status, können Sie alle sehen:

   On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

So zeigen Sie alle versteckten Verzweigungstypen an:

 git branch -a

Es werden alle Remote-Zweige aufgelistet.

Wenn Sie nun in einem bestimmten Zweig auschecken möchten, geben Sie einfach Folgendes ein:

git checkout -b localBranchName origin/RemteBranchName

16

Wenn Sie hier nach einer Lösung suchen, um alle Zweige abzurufen und dann alles auf einen anderen Git-Server zu migrieren, habe ich den folgenden Prozess zusammengestellt. Wenn Sie nur alle Zweige lokal aktualisieren möchten, halten Sie an der ersten leeren Zeile an.

git clone <ORIGINAL_ORIGIN>
git branch -r | awk -F'origin/' '!/HEAD|master/{print $2 " " $1"origin/"$2}' | xargs -L 1 git branch -f --track 
git fetch --all --prune --tags
git pull --all

git remote set-url origin <NEW_ORIGIN>
git pull
<resolve_any_merge_conflicts>
git push --all
git push --tags
<check_NEW_ORIGIN_to_ensure_it_matches_ORIGINAL_ORIGIN>

3
Sehr hilfreich; genau das, was ich brauchte. Das einzige, was ich ändern musste, war in der zweiten Zeile, einfache Anführungszeichen um 'HEAD' und 'master' hinzuzufügen; wahrscheinlich weil ich zsh benutze. Vielen Dank!
Sockmonk

Dies geschieht im Wesentlichen wie folgt: (1) Erhalten der tatsächlichen Namen von entfernten Zweigen [nicht Kopf, nicht Meister]; (2) Git vollständig anweisen, sie zu verfolgen [nicht alle Lösungen tun dies]; (3) Abrufen und Ziehen von allem aus diesen Zweigen [einschließlich Tags]; (4) Einen neuen Ursprung setzen und durchgehen, um absolut alles nach oben zu schieben. Auch hier können die meisten anderen Lösungen nicht alle Teile bewegen. Das macht alles.
Ingyhere

1
Ich entfernte das Antimuster von grep und awk und verdichtete die grep-Befehle in den awk-Befehl. Danke Tripleee !
Ingyhere

Lesen Sie dies und schreiben git fetch git pull Sie
Green

Git pullmacht zwar eine fetcherste, aber es ist einfacher zu erkennen, ob das Problem von dem fetchTeil pulloder dem nachfolgenden mergeTeil stammt, pullwenn fetches unabhängig ausgeführt wird.
Ingyhere

12

Nachdem Sie das Master-Repository geklont haben, können Sie es einfach ausführen

git fetch && git checkout <branchname>

1
einfach. und arbeitete, um einen Zweig von entferntem Ursprung zu bekommen
Sirvon

3
Dies beantwortet nicht die ursprüngliche Frage: "Wie würde ich alle Zweige lokal ziehen?" Es zieht sie einzeln, was nicht skalierbar ist. Betrachten Sie den Fall von 100 Zweigen.
Ingyhere

10

Stellen Sie sicher, dass alle Remote-Zweige in einer .git/configDatei abgerufen werden können.

In diesem Beispiel kann nur der origin/productionZweig abgerufen werden, auch wenn Sie versuchen, nichts git fetch --allanderes zu tun , als den Zweig abzurufen production:

[origin]
fetch = +refs/heads/production:refs/remotes/origin/production

Diese Zeile sollte ersetzt werden durch:

[origin]
fetch = +refs/heads/*:refs/remotes/origin/*

Dann laufen git fetchetc ...


3
Zu inspizieren: git config --get remote.origin.fetchund dann (destruktiv) einzustellen:git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
qneill

oder ändern Sie die Konfigurationstextdatei im .git-Verzeichnis, die für mich funktioniert hat
FDIM

9

Looping schien für mich nicht zu funktionieren und ich wollte Origin / Master ignorieren. Folgendes hat bei mir funktioniert.

git branch -r | grep -v HEAD | awk -F'/' '{print $2 " " $1"/"$2}' | xargs -L 1 git branch -f --track

Nachdem:

git fetch --all
git pull --all

1
Eine Variation davon ist die richtige Antwort, aber diese funktioniert nicht in allen Randfällen. Auch die Filialnamen können funky sein. Also habe ich folgendes gemacht: git branch -r | grep -v KOPF | grep –v master | awk -F'origin / '' {print $ 2 "" $ 1 "origin /" $ 2} '| xargs -L 1 git branch -f --track; git fetch --all; git pull --all; Und das hat der Trick getan!
Ingyhere

3
Eine stilistische Verbesserung der vermeiden grep | awk Antipattern : git branch -r | awk -F 'origin/' '!/HEAD|master/{...
tripleee

7

Nur diese drei Befehle erhalten alle Zweige:

git clone --mirror repo.git  .git     (gets just .git  - bare repository)

git config --bool core.bare false

git reset --hard

Dies ist eigentlich die Wurzel des OP-Problems. Wenn er richtig geklont wäre, müsste er keine machen pull --all. Aber wenn es noch nötig ist, ist die andere Antwort von @Johnno Nola, vorausgesetzt, alle Zweige werden verfolgt, gemischt mit dieser Antwort, der richtige Weg.
Dr. Beco

7

Warum beantwortet niemand die Frage der Jungs und erklärt, was passiert?

  1. Stellen Sie sicher, dass Sie alle Remote-Zweige verfolgen (oder welche auch immer Sie verfolgen möchten) .
  2. Aktualisieren Sie Ihre lokalen Niederlassungen, um die Remote-Niederlassungen widerzuspiegeln.

Verfolgen Sie alle entfernten Zweige:

Verfolgen Sie alle Zweige, die im Remote-Repo vorhanden sind.

Manuell tun:

Sie würden durch <branch>einen Zweig ersetzen , der in der Ausgabe von angezeigt wird git branch -r.

git branch -r
git branch --track <branch>

Mach es mit einem Bash-Skript

for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done

Aktualisieren Sie Informationen zu den Remote-Zweigen auf Ihrem lokalen Computer:

Dadurch werden Aktualisierungen von Zweigen aus dem Remote-Repo abgerufen, die Sie in Ihrem lokalen Repo verfolgen. Dies ändert nichts an Ihren lokalen Niederlassungen. Ihr lokales Git-Repo ist jetzt über die Ereignisse in den Remote-Repo-Filialen informiert. Ein Beispiel wäre, dass ein neues Commit an den Remote-Master gesendet wurde. Wenn Sie einen Abruf durchführen, werden Sie jetzt darauf hingewiesen, dass Ihr lokaler Master um 1 Commit zurückliegt.

git fetch --all

Aktualisieren Sie Informationen zu den Remote-Zweigen auf Ihrem lokalen Computer und aktualisieren Sie die lokalen Zweige:

Führt einen Abruf durch, gefolgt von einer Zusammenführung aller Zweige vom Remote-Zweig zum lokalen Zweig. Ein Beispiel wäre, dass ein neues Commit an den Remote-Master gesendet wurde. Wenn Sie einen Pull ausführen, wird Ihr lokales Repo über die Änderungen in der Remote-Verzweigung aktualisiert und diese Änderungen werden dann in Ihrer lokalen Verzweigung zusammengeführt. Dies kann aufgrund von Zusammenführungskonflikten zu einem ziemlichen Durcheinander führen.

git pull --all

4

Ich habe ein kleines Skript geschrieben, um das Klonen eines neuen Repos und das Erstellen lokaler Zweige für alle entfernten Zweige zu verwalten.

Die neueste Version finden Sie hier :

#!/bin/bash

# Clones as usual but creates local tracking branches for all remote branches.
# To use, copy this file into the same directory your git binaries are (git, git-flow, git-subtree, etc)

clone_output=$((git clone "$@" ) 2>&1)
retval=$?
echo $clone_output
if [[ $retval != 0 ]] ; then
    exit 1
fi
pushd $(echo $clone_output | head -1 | sed 's/Cloning into .\(.*\).\.\.\./\1/') > /dev/null 2>&1
this_branch=$(git branch | sed 's/^..//')
for i in $(git branch -r | grep -v HEAD); do
  branch=$(echo $i | perl -pe 's/^.*?\///')
  # this doesn't have to be done for each branch, but that's how I did it.
  remote=$(echo $i | sed 's/\/.*//')
  if [[ "$this_branch" != "$branch" ]]; then
      git branch -t $branch $remote/$branch
  fi
done
popd > /dev/null 2>&1

Um es zu verwenden, kopieren Sie es einfach in Ihr Git Bin-Verzeichnis (für mich ist das C:\Program Files (x86)\Git\bin\git-cloneall) und dann in die Befehlszeile:

git cloneall [standard-clone-options] <url>

Es klont wie gewohnt, erstellt jedoch lokale Tracking-Zweige für alle Remote-Zweige.


4

So rufen Sie alle Git-Zweige ab, die eine einzelne Fernbedienung verfolgen.

Dies wurde getestet und funktioniert unter Red Hat und Git Bash unter Windows 10.


TLDR:

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

Erläuterung:

Der Einzeiler checkt aus und holt dann alle Zweige außer HEAD.

Listen Sie die Remote-Tracking-Zweige auf.

git branch -r

KOPF ignorieren.

grep -v ' -> '

Nehmen Sie den Filialnamen von den Fernbedienungen ab.

cut -d"/" -f2

Kasse aller Filialen, die eine einzelne Fernbedienung verfolgen.

git checkout $branch

Für ausgecheckten Zweig abrufen.

git fetch

Technisch wird der Abruf für neue lokale Niederlassungen nicht benötigt.

Dies kann entweder für fetchoder für pullZweige verwendet werden, die beide neu sind und Änderungen an Remote (s) aufweisen.

Stellen Sie einfach sicher, dass Sie nur ziehen, wenn Sie zum Zusammenführen bereit sind.


Versuchsaufbau

Überprüfen Sie ein Repository mit SSH-URL.

git clone git@repository.git

Vor

Überprüfen Sie die Filialen vor Ort.

$ git branch
* master

Befehle ausführen

Führen Sie den einen Liner aus.

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

Nach

Überprüfen Sie, ob lokale Zweige Remote-Zweige enthalten.

$ git branch
  cicd
  master
* preprod

4

Für Windows-Benutzer, die PowerShell verwenden:

git branch -r | ForEach-Object {
    # Skip default branch, this script assumes
    # you already checked-out that branch when cloned the repo
    if (-not ($_ -match " -> ")) {
        $localBranch = ($_ -replace "^.*?/", "")
        $remoteBranch = $_.Trim()
        git branch --track "$localBranch" "$remoteBranch"
    }
}
git fetch --all
git pull --all

Dies funktioniert mit Zweigen mit / im Namen: git branch -r | ForEach-Object { # Skip default branch, this script assumes # you already checked-out that branch when cloned the repo if (-not ($_ -match " -> ")) { $localBranch = ($_ -replace "^.*?/", "") $remoteBranch = $_.Trim() git branch --track "$localBranch" "$remoteBranch" } }
Markus

3

Folgendes würde ich als robust betrachten:

  • Aktualisiert die Fernverfolgung für vorhandene Zweige nicht
  • Versucht nicht zu aktualisieren, um HEADzu verfolgenorigin/HEAD
  • Ermöglicht andere Fernbedienungen als origin
  • Richtig Shell zitiert
for b in $(git branch -r --format='%(refname:short)'); do
  [[ "${b#*/}" = HEAD ]] && continue
  git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
done
git pull --all

Es ist nicht notwendig , um git fetch --alldie Weitergabe -allan git pullPässen diese Option , um die internen fetch.

Gutschrift auf diese Antwort .


2

Hier ist eine Perl-Version des Einzeilers in der akzeptierten Antwort:

git branch -r | perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~ /origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file

Sie können die Ausgabedatei als Shell-Skript ausführen, wenn Sie möchten.

Wir haben versehentlich unser Stash-Projekt-Repository gelöscht. Glücklicherweise hatte jemand kurz vor dem versehentlichen Verlust eine Gabel geschaffen. Ich habe die Gabel an meinen Einheimischen geklont (ich werde die Details darüber, wie ich das gemacht habe, weglassen). Sobald ich die Gabel vollständig in meinem Lokal hatte, fuhr ich einen Einzeiler. Ich habe die URL der Fernbedienung (Ursprung in meinem Fall) so geändert, dass sie auf das Ziel-Repository verweist, in das wir wiederhergestellt haben:

git remote set-url origin <remote-url>

Und schließlich alle Zweige so zum Ursprung gebracht:

git push --all origin

und wir waren wieder im Geschäft.


1

Wir können alle Zweig- oder Tag-Namen in eine temporäre Datei einfügen und dann für jeden Namen / Tag git pull ausführen:

git branch -r | grep origin | grep -v HEAD| awk -F/ '{print $NF}' > /tmp/all.txt
git tag -l >> /tmp/all.txt
for tag_or_branch in `cat /tmp/all.txt`; do git checkout $tag_or_branch; git pull origin $tag_or_branch; done

1

Wenn Sie Probleme mit haben, fetch --allverfolgen Sie Ihren Remote-Zweig:

git checkout --track origin/%branchname%

1

Um die Fehlermeldung 'fatal' zu vermeiden: Ein Zweig mit dem Namen 'origin / master' existiert bereits. 'Benötigen Sie Folgendes:

git branch -r | grep -v '\->'  | grep -v `git branch | awk '/\*/ { print $2; }'`| while read remote; do git branch --track "${remote#origin/}" "$remote"; done

0

Basierend auf der Antwort von Learath2 habe ich Folgendes getan, nachdem ich es getan git clone [...]und cdin das erstellte Verzeichnis eingegeben habe :

git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b

Hat für mich gearbeitet, aber ich kann nicht wissen, dass es für Sie funktionieren wird. Achtung.


0
git remote add origin https://yourBitbucketLink

git fetch origin

git checkout -b yourNewLocalBranchName origin/requiredRemoteBranch (use tab :D)

Jetzt vor Ort bist du yourNewLocalBranchNamedein requiredRemoteBranch.


0

Für Visual Studio-Benutzer in der Package Manager-Konsole:

Git-Zweig | % {git fetch upstream; Git Merge Upstream / Master}


0

Habe viele Möglichkeiten ausprobiert, nur diese ist einfach und funktioniert für mich.

for branch in $(git ls-remote -h git@<your_repository>.git | awk '{print $2}' | sed 's:refs/heads/::')
do
  git checkout "$branch"
  git pull
done

0

Alias ​​festlegen: (basierend auf der Top-Antwort)

git config --global alias.track-all-branches '!git fetch --all && for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done && git fetch --all'

Um nun alle Zweige zu verfolgen:

git track-all-branches

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.