Wie klone ich alle Remote-Zweige in Git?


4129

Ich habe einen masterund einen developmentZweig, beide auf GitHub geschoben . Ich habe cloned, pulled und fetched, aber ich kann nichts anderes als den masterZweig zurückbekommen.

Ich bin mir sicher, dass mir etwas Offensichtliches fehlt, aber ich habe das Handbuch gelesen und bekomme überhaupt keine Freude.


133
Die akzeptierte Antwort hier ( git branch -a) zeigt Ihnen die Zweige in der Fernbedienung. Wenn Sie jedoch versuchen, einen dieser Zweige auszuchecken, befinden Sie sich in einem Status "getrennter KOPF". Die nächste Antwort nach unten (zweithöchste Upvotes) beantwortet eine andere Frage (das heißt: Wie werden alle Zweige gezogen, und dies funktioniert wiederum nur für diejenigen, die Sie lokal verfolgen). In mehreren Kommentaren wird darauf hingewiesen, dass Sie die git branch -aErgebnisse mit einem Shell-Skript analysieren können, das alle Remote-Zweige lokal verfolgt. Zusammenfassung: Es gibt keinen git-nativen Weg, um das zu tun, was Sie wollen, und es ist vielleicht sowieso keine so gute Idee.
Tag Davis Waterbury

5
Vielleicht kopieren Sie einfach den gesamten Ordner auf die altmodische Weise? scp some_user@example.com:/home/some_user/project_folder ~Ich bin mir nicht sicher, ob diese Lösung für Github funktioniert.
snapfractalpop

19
Anstatt zu sagen "Ich habe geklont, gezogen und abgerufen", ist es viel besser, uns die genauen Befehle zu zeigen, die Sie ausgeführt haben.
Bob Gilmore

57
Es verwirrt mich immer wieder, warum "Klonen" nicht im Sinne einer exakten Kopie ist. Wenn es sich um einen exakten Klon handelt, sollten nicht alle Zweige Teil des lokalen Repositorys sein? Ich meine, ist das nicht einer der Gründe, verteilt zu werden? Wenn also ein Repository weg ist, haben Sie immer noch eine vollständige Kopie von allem. Oder sind die sogenannten "Remote" wirklich schon Teil des lokalen Repositorys?
Huggie

21
Angesichts all der positiven Stimmen, Antworten, Kommentare zu Antworten und der umwerfenden Anzahl von Ansichten denke ich, dass es an der Zeit ist, dass git einen Befehl dazu hinzufügt. Und richtig du bist @huggie, meine Gedanken genau.
Sнаđошƒаӽ

Antworten:


4557

Klonen Sie zunächst ein entferntes Git- Repository und eine CD darin:

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

Schauen Sie sich als Nächstes die lokalen Zweige in Ihrem Repository an:

$ git branch
* master

Aber es gibt noch andere Zweige, die sich in Ihrem Repository verstecken! Sie können diese mit der -aFlagge sehen:

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

Wenn Sie nur einen kurzen Blick auf eine vorgelagerte Filiale werfen möchten, können Sie dies direkt überprüfen:

$ git checkout origin/experimental

Wenn Sie jedoch an diesem Zweig arbeiten möchten, müssen Sie einen lokalen Tracking-Zweig erstellen, der automatisch durchgeführt wird von:

$ git checkout experimental

und du wirst sehen

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

Diese letzte Zeile wirft einige Leute: "Neuer Zweig" - nicht wahr? Was es wirklich bedeutet, ist, dass der Zweig aus dem Index genommen und lokal für Sie erstellt wird. Die vorherige Zeile ist tatsächlich informativer, da sie Ihnen sagt, dass der Zweig so eingerichtet ist, dass er den Remote-Zweig verfolgt, was normalerweise den Zweig origin / branch_name bedeutet

Wenn Sie sich nun Ihre lokalen Niederlassungen ansehen, sehen Sie Folgendes:

$ git branch
* experimental
  master

Sie können tatsächlich mehr als ein Remote-Repository mit verfolgen 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

An diesem Punkt werden die Dinge ziemlich verrückt, also renn gitklos , um zu sehen, was los ist:

$ gitk --all &

119
Wie kann jemand automatisch alle entfernten Zweige erstellen, z. B. experimentell für Ursprung / experimentell?
Cristian Ciupitu

54
Cristian: Ich habe immer einen Zweig 'foo' für jeden Zweig 'origin / foo' erstellt, aber dies führte zu zwei Problemen: (1) Ich hatte viele wirklich veraltete Verfolgungszweige, die viele Commits hinter dem entsprechenden entfernten Zweig waren und (2) In älteren Versionen von git würde das Ausführen von "git push" versuchen, alle meine lokalen Zweige auf eine Fernbedienung zu übertragen, selbst wenn diese Zweige veraltet waren. Daher behalte ich jetzt nur lokale Niederlassungen für Dinge, die ich aktiv entwickle, und greife direkt auf die origin / * -Zweige zu, wenn ich Informationen darüber benötige. (Das heißt, Sie könnten ein Shell-Skript verwenden, um 'git branch -a' zu analysieren.)
emk

49
"git fetch <origin-name> <branch-name>" bringt den Zweig für Sie lokal zum Erliegen.

137
Gute Antwort, aber irgendwie fehlt die Frage. Ich suchte nach einem Einzeiler, um alle entfernten Filialen zu überprüfen.
cmcginty

32
Die Frage war, alle entfernten Zweige zu klonen und nicht auszuchecken. Und wie ich oben erwähnt habe, möchten Sie wirklich nicht mehr lokale Tracking-Zweige als nötig erstellen, denn wenn sie wirklich abgestanden sind, können sie Kopfschmerzen verursachen.
emk

822

Wenn Sie viele Remote-Zweige haben, die Sie gleichzeitig abrufen möchten, gehen Sie wie folgt vor:

$ git pull --all

Jetzt können Sie jeden Zweig nach Bedarf auschecken, ohne auf das Remote-Repository zuzugreifen.


12
Wenn ich Git-Klon mache, habe ich den Hauptzweig lokal und 10 Zweige "remote". Diese Antwort von Gabe war also sehr hilfreich und beantwortet die Frage.
BasZero

38
Dies
ruft

33
Der erste Befehl ist redundant. Einfach git pull --alldas Gleiche tun - es wird nur nicht zweimal abgerufen. Und infosec812 hat recht, dass dies die Frage sowieso nicht beantwortet. Ich frage mich, wie das so viele positive Stimmen bekommen hat.
Sven Marnach

6
Nachdem ich es getan git remote updateund dann versucht habe git branch, sehe ich nur lokale Niederlassungen. Aber wenn ich das tue, git branch -akann ich jetzt die entfernten Zweige sehen und ich kann einen tun git pull <branchname>, um den Zweig zu bekommen, den ich will. - Ich bin auf diese Frage aus einer Google-Suche gestoßen, und diese Antwort löst mein Problem.
WNRosenberg

38
Dies ist überhaupt nicht hilfreich, zieht keine anderen entfernten Zweige als die vorhandenen.
Avinash R

446

Dieses Bash- Skript hat mir geholfen:

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

Es werden Verfolgungszweige für alle Remote-Zweige erstellt, mit Ausnahme des Masters (den Sie wahrscheinlich vom ursprünglichen Klonbefehl erhalten haben). Ich denke, Sie müssen möglicherweise noch eine tun

git fetch --all
git pull --all

um sicher zu sein.

Ein Liner : 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
Wie üblich: Testen Sie Ihr Setup, bevor Sie das bekannte rm -rf-Universum kopieren

Credits für Einzeiler gehen an Benutzer cfi


19
Dies ist fast eine perfekte Lösung. Das einzige, was es besser machen würde, wäre, wenn diese Funktionalität als Option in git integriert wäre.
Deven Phillips

51
"One Liner": 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 Wie üblich: Testen Sie Ihr Setup vor dem Kopierenrm -rf universe as we know it
siehe

4
Dieser Befehl erstellt die Feature-Zweige von Remote als normale Zweige (keine Feature-Zweige). Wie kann dies behoben werden?
Alex2php

4
Wenn Sie Probleme mit "/" in Zweigstellennamen haben, finden Sie unten eine Lösung mit einem Git-Alias. siehe Antwort von "niemand" auf "beantwortet 15. Mai 13 um 11:02"
wemu

8
Ich remotes/origin/for BRANCH in $(git branch -a | grep remotes | grep -v HEAD | grep -v master); do git branch --track "${BRANCH#remotes/origin/}" "${BRANCH}"; done
schneide

348

Die Verwendung der --mirrorOption scheint die remoteTracking-Zweige ordnungsgemäß zu kopieren . Das Repository wird jedoch als nacktes Repository eingerichtet, sodass Sie es anschließend wieder in ein normales Repository umwandeln müssen.

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

Referenz: Git FAQ: Wie klone ich ein Repository mit allen remote verfolgten Zweigen?


7
Sie wissen, dass dies tatsächlich eine ziemlich gute Antwort zu sein scheint, obwohl es keine Stimmen gibt. Gibt es irgendwelche Fallstricke, wenn man das so macht? Ich musste einen Zweig explizit auschecken, nachdem ich diese Befehle ausgeführt hatte.
Schleife

27
Dies zusammen mit git push --mirror ist genau das, was ich brauchte, um ein genaues Duplikat eines Remote-Git-Repos zu erstellen, wenn ich von github.com zu einer github-Unternehmensinstallation wechselte. Vielen Dank!
Jacob Fike

3
@ Dave: Fügen Sie einen letzten git checkoutals letzten Befehl hinzu, um den Kopf des aktuellen Zweigs im geklonten Repo endgültig auszuchecken . Dies ist eine großartige Antwort, bei weitem die beste. Sei mutig, irgendwann bringen wir dich an die Spitze :-)
cfi

3
@ Dave: Hm. Ich habe Bedenken: --mirror ist mehr als nur das Einrichten aller Zweige als verfolgt. Es kopiert alle Refs vom Ursprung und git remote updatewird dies anschließend erneut tun. Verhalten von Zügen ändern sich. Ich bin wieder der Meinung, dass für die vollständige Kopie ein einzeiliges Skript erforderlich ist.
cfi

5
git clone --mirrorist sehr gut für die Sicherung Ihrer Git-Repositories ^ _ ^
TrinitronX

220

Sie können ganz einfach zu einem Zweig wechseln, ohne die ausgefallene Syntax "git checkout -b somebranch origin / somebranch" zu verwenden. Sie können einfach tun:

git checkout somebranch

Git macht automatisch das Richtige:

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

Git prüft, ob ein Zweig mit demselben Namen in genau einer Fernbedienung vorhanden ist. Wenn dies der Fall ist, wird er auf dieselbe Weise verfolgt, als hätten Sie ausdrücklich angegeben, dass es sich um eine Fernverzweigung handelt. Aus der Git-Checkout-Manpage von Git 1.8.2.1:

Wenn <branch> nicht gefunden wird, aber in genau einer Fernbedienung ein Tracking-Zweig (nennen Sie ihn <remote>) mit einem übereinstimmenden Namen vorhanden ist, behandeln Sie ihn als äquivalent zu

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

1
Wenn also der Name des Zweigs, den Sie verwenden, checkoutmit dem Namen des Remote-Zweigs identisch ist, alles nach dem "/", erstellt git einen Zweig mit demselben Namen, alles nach dem "/", "Tracking" dieses Remote ? Und durch Tracking, meinen wir: git push, git pullwird usw. auf diesem entfernten getan werden? Wenn dies korrekt ist, erweitern Sie Ihre Antwort mit weiteren Informationen, da ich mit @Daniel einverstanden bin, verdient diese Antwort mehr Wiederholung.
Gerard Roche

5
@BullfrogBlues, die Antwort auf alle Ihre Fragen scheint ja zu sein (ich verwende git v1.7.7.4). Ich bin damit einverstanden, dass dieses Verhalten besser bekannt sein sollte. (Es ist nicht im Handbuch für diese Version von git.) Ich mag dieses Verhalten eigentlich nicht, ich würde lieber einen Fehler bekommen und muss git checkout --track origin/somebranchexplizit sagen .
Dubiousjim

3
@dubiousjim: Eigentlich steht das im Handbuch. git-checkout (1) sagt: "Wenn <branch> nicht gefunden wird, aber in genau einer Fernbedienung ein Tracking-Zweig (nennen Sie ihn <remote>) mit einem übereinstimmenden Namen vorhanden ist, behandeln Sie ihn als äquivalent zu 'git checkout -b <branch." > --track <remote> / <branch> '"(Git V.1.8.1.1).
Sleske

Was wir brauchen, ist $ git pull * <remote> / * - wobei "*" ein Platzhalter ist, sodass alle Zweige abgerufen werden, einschließlich derjenigen, die sich noch nicht auf dem lokalen System befinden. Wie macht man das? Sollen wir wirklich jeden Zweig auschecken / abrufen, um den Code auf unser lokales System zu übertragen?
JosephK

98

Bezüglich,

$ git checkout -b experimenteller Ursprung / experimentell

mit

$ git checkout -t origin/experimental

oder umso ausführlicher, aber leichter zu merken

$ git checkout --track origin/experimental

könnte besser sein, wenn es darum geht, ein Remote-Repository zu verfolgen.


Sie meinen also, die zweite Form ist nur leichter zu merken und es gibt keinen anderen Unterschied?
Aderchox

79

Der Abruf, den Sie ausführen, sollte alle Remote-Zweige abrufen, es werden jedoch keine lokalen Zweige für sie erstellt. Wenn Sie gitk verwenden, sollten Sie die Remote-Zweige sehen, die als "remotes / origin / dev" oder ähnliches beschrieben werden.

Gehen Sie folgendermaßen vor, um einen lokalen Zweig basierend auf einem Remote-Zweig zu erstellen:

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

Welches sollte etwas zurückgeben wie:

Zweigentwickler eingerichtet, um entfernte Zweigstellenreferenzen / Fernbedienungen / Ursprung / Entwickler zu verfolgen.
Zu einem neuen Zweig "dev" gewechselt

Wenn Sie sich jetzt im Entwicklungszweig befinden, aktualisiert "git pull" Ihren lokalen Entwickler auf den gleichen Punkt wie den Remote-Entwicklungszweig. Beachten Sie, dass alle Zweige abgerufen werden, aber nur der, auf dem Sie sich befinden, an die Spitze des Baums gezogen wird.


14
Sie brauchen hier keine Refs / Fernbedienungen. git checkout -b dev origin / dev wird gut funktionieren.
Emk

3
Dies wird immer funktionieren : git checkout -b newlocaldev --track origin/dev. Wenn Sie möchten, dass der lokale Zweig denselben Namen wie der entfernte Zweig hat und der entfernte Zweig keinen kniffligen Namen hat, können Sie den weglassen -b newlocaldev. Mit der Standardkonfigurationseinstellung branch.autosetupmergeund unter der Annahme, dass Sie keinen lokalen Zweig mit dem Namen haben dev, können diese beiden Befehle dasselbe tun: git checkout -b dev origin/devund einfach nur git checkout dev. Schließlich wird git checkout origin/devkein neuer Zweig erstellt, sondern Sie werden nur in den getrennten HEAD-Status versetzt.
Dubiousjim

Was passiert, wenn die Fernbedienung nicht mehr existiert, Git aber zu dumm ist, um zu bestätigen, dass sie gelöscht wurde? Dies setzt voraus, dass Sie aktualisiert wurden, und git branch -alistet es weiterhin als Remote-Zweig auf.
JWW

Und das machen wir für Dutzende von Filialen?
JosephK

59

Wenn Sie "git clone git: // location" ausführen, werden alle Zweige und Tags abgerufen.

Um auf einem bestimmten Remote-Zweig zu arbeiten, wird davon ausgegangen, dass es sich um den Ursprungs-Remote handelt:

git checkout -b branch origin/branchname

2
Ich freue mich über Ihren Hinweis "Alle Zweige und Tags werden abgerufen". Ich wollte Ihre falsche Antwort kommentieren, aber dann habe ich sie überprüft und festgestellt, dass Sie vollkommen richtig liegen. In gewisser Weise haben Sie die kürzeste Antwort gegeben - wenn Sie geklont haben, haben Sie sie bereits. Nett. Man könnte versuchen hinzuzufügen: Versuchen Sie $ git branch -aherauszufinden, welche Remote-Zweige bereits verfügbar sind.
Jan Vlcinsky

Schauen Sie sich auch die Antwort an, die ich gepostet habe. Dies kann hilfreich sein, wenn Sie wissen, dass Sie in vielen Remote-Filialen lokal arbeiten möchten und diese nicht einzeln auschecken müssen.
Lacostenycoder

Können Sie mir erklären, was der Unterschied zwischen git checkout -b master origin/masterund git checkout --track origin/masterbitte ist?
Aderchox

1
@aderchox Heutzutage denke ich keine.
Elmarco

58

Verwenden Sie Aliase. Obwohl es keine nativen Git-Einzeiler gibt, können Sie Ihre eigenen als definieren

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

und dann verwenden als

git clone-branches

Vielen Dank. Dies klont tatsächlich alle entfernten Zweige im Gegensatz zu einigen anderen Antworten
FearlessHyena

50

Warum Sie nur "Meister" sehen

git cloneLädt alle Remote-Zweige herunter, betrachtet sie jedoch weiterhin als "Remote", obwohl sich die Dateien in Ihrem neuen Repository befinden. Es gibt eine Ausnahme: Der Klonprozess erstellt einen lokalen Zweig namens "master" aus dem Remote-Zweig namens "master". Standardmäßig werden git branchnur lokale Zweige angezeigt, weshalb nur "master" angezeigt wird .

git branch -azeigt alle Zweige an, einschließlich entfernter Zweige .


So erhalten Sie lokale Niederlassungen

Wenn Sie tatsächlich an einem Zweig arbeiten möchten, benötigen Sie wahrscheinlich eine "lokale" Version davon. Um einfach lokale Zweige aus entfernten Zweigen zu erstellen (ohne sie auszuchecken und dadurch den Inhalt Ihres Arbeitsverzeichnisses zu ändern) , können Sie dies folgendermaßen tun:

git branch branchone origin/branchone
git branch branchtwo origin/branchtwo
git branch branchthree origin/branchthree

In diesem Beispiel branchoneist dies der Name eines lokalen Zweigs, auf dessen Grundlage Sie erstellen origin/branchone. Wenn Sie stattdessen lokale Zweige mit unterschiedlichen Namen erstellen möchten, können Sie dies tun:

git branch localbranchname origin/branchone

Sobald Sie einen lokalen Zweig erstellt haben, können Sie ihn mit git branchanzeigen (denken Sie daran, dass Sie keine -alokalen Zweige sehen müssen).


Wenn origin/branchonevorhanden, können Sie auch einfach git checkout branchoneeinen lokalen Zweig mit demselben Namen erstellen und ihn so einstellen, dass er remote verfolgt wird.
Evan

47

Dies ist nicht zu kompliziert, sehr einfache und direkte Schritte sind wie folgt;

git fetch origin Dadurch werden alle Remote-Zweigstellen zu Ihrem lokalen Zweig gebracht.

git branch -a Dies zeigt Ihnen alle entfernten Zweige.

git checkout --track origin/<branch you want to checkout>

Überprüfen Sie mit dem folgenden Befehl, ob Sie sich in der gewünschten Verzweigung befinden.

git branch

Die Ausgabe wird dies mögen;

*your current branch 
some branch2
some branch3 

Beachten Sie das * -Zeichen, das den aktuellen Zweig kennzeichnet.


1
Danke suraj. Der Grund, weil es nicht viel gewählt wurde. Und die Ans wird vom Fragesteller nicht akzeptiert.
Sam

Der "git fetch origin" hat keinen der entfernten Zweige zu meinem lokalen gebracht - oder sind sie irgendwo versteckt? Das Lesen aller obigen Antworten bereitete mir Kopfschmerzen. Wir suchen nach "git hol alle Filialen nach lokal". Abgesehen von Bash-Skripten muss es einen Weg geben, dies zu tun.
JosephK

1
Kurz nachdem Sie "git fetch origin" ausgeführt haben, wird die Ausgabe in Ihrem Terminal wie folgt angezeigt - "* [neuer Zweig] branch_name -> origin / branch_name". Wenn Sie jedoch "git branch" ausführen, wird nur Ihr lokaler angezeigt Zweige stattdessen, um alle Zweige zu sehen, können Sie "git branch -a" ausführen und dann zum Remote-Zweig wechseln, müssen Sie "git checkout --track origin / <Zweig, den Sie auschecken möchten>" ausführen. Hoffe das hilft. :-)
Sam

4
Suraj, weil die Frage war, wie man "alle entfernten Zweige klont" - nicht wie man einzeln manuell aktualisiert. Es scheint, dass es keine Antwort auf die eigentliche Frage gibt - nur Möglichkeiten, viel zu tippen, wenn Sie viele Zweige haben.
JosephK

47

Besser spät als nie, aber hier ist der beste Weg, dies zu tun:

mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard

Zu diesem Zeitpunkt haben Sie eine vollständige Kopie des Remote-Repos mit allen Zweigen (überprüfen mit git branch). Sie können --mirrorstattdessen verwenden, --barewenn Ihr Remote-Repo über eigene Fernbedienungen verfügt.


Bei den Änderungen hier ist ein Fehler aufgetreten. Diese Antwort macht keinen Sinn. Das --bareim letzten Satz erwähnte " " ist in der angegebenen Befehlsliste nicht vorhanden.
Cerran

Aus Daves Antwort unten. Die Verwendung von 'git config --bool core.bare false' anstelle von 'git config unset core.bare' scheint den Job zu erledigen.
Verwirrter Vorlon

Ich habe die error: key does not contain a section: unset. Die Antwort von Dave funktioniert besser.
Olibre

Es ist git config --unset core.baretatsächlich ... Für mich scheint dies die sauberste Lösung von allen zu sein, die in den Antworten hier vorgestellt werden. Schade, dass es so wenige positive Stimmen gibt ...
Dirk Hillbrecht

1
Danke @ChrisSim, dem ich zustimme git config --bool core.bare false. Deshalb empfehle ich stattdessen die Antwort von Dave . Was denkst du über die Antwort von Dave ? Cheers
Olibre

39

Mach das einfach:

$ git clone git://example.com/myproject
$ cd myproject
$ git checkout branchxyz
Branch branchxyz set up to track remote branch branchxyz from origin.
Switched to a new branch 'branchxyz'
$ git pull
Already up-to-date.
$ git branch
* branchxyz
  master
$ git branch -a
* branchxyz
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/branchxyz
  remotes/origin/branch123

Sie sehen, 'git clone git: //example.com/myprojectt' ruft alles ab, auch die Zweige. Sie müssen sie nur auschecken, dann wird Ihr lokaler Zweig erstellt.


25

Sie müssen nur "git clone" verwenden, um alle Zweige zu erhalten.

git clone <your_http_url>

Obwohl Sie nur den Hauptzweig sehen, können Sie mit "git branch -a" alle Zweige anzeigen.

git branch -a

Und Sie können zu jedem Zweig wechseln, den Sie bereits haben.

git checkout <your_branch_name>

Machen Sie sich keine Sorgen, dass Sie nach dem "Git-Klonen" keine Verbindung zum Remote-Repo herstellen müssen. "Git-Zweig -a" und "Git-Checkout" können erfolgreich ausgeführt werden, wenn Sie Ihr WLAN schließen. Es ist also bewiesen, dass beim Ausführen von "git clone" bereits alle Zweige aus dem Remote-Repo kopiert wurden. Danach benötigen Sie das Remote-Repo nicht mehr, Ihr lokaler hat bereits alle Filialcodes.


Sehr klare Antwort hier. Viele Leute sind verwirrt über dieses Thema.
XMAN

Ich möchte Ihre Aussage "Kann erfolgreich ausgeführt werden, wenn Sie Ihr WLAN schließen" unterstützen. "git clone" führt wirklich zu einem Repo, das alle Zweige enthält.
Bvgheluwe

Eine großartige, klare und unkomplizierte Antwort.
Amr

24

A git clonesoll das gesamte Repository kopieren. Versuchen Sie es zu klonen und führen Sie es dann aus git branch -a. Es sollte alle Zweige auflisten. Wenn Sie dann zu Zweig "foo" anstelle von "master" wechseln möchten, verwenden Sie git checkout foo.


1
Sie können Git-Befehle mit oder ohne Bindestrich ausführen. Sowohl "git-branch" als auch "git branch" funktionieren.
Peter Boughton

21
Vielleicht wurde diese Antwort vor langer Zeit gegeben, als Git anders funktionierte, aber ich denke, es ist heute irreführend. git clonelädt zwar alle Remote-Zweige herunter, macht aber nur einen lokalen Zweig des Masters. Da git branchnur lokale Zweige angezeigt werden, müssen auch git branch -aentfernte Zweige angezeigt werden.
Cerran

Vielen Dank. Dies ist eine Art seltsames Standardverhalten IMO. Ich werde es nur einem kryptischeren Zeugen mitteilen. Wenn es die Zweige heruntergeladen hat, warum sollte es sie verbergen, wenn es den Git-Zweig aufruft?
Adam Hughes

1
@ Kerran, danke; Ich habe meine Antwort entsprechend aktualisiert.
MattoxBeckman

"lädt alle Remote-Zweige herunter, macht aber nur einen lokalen Zweig des Masters". Ich brauche Hilfe, um das zu verstehen. Es scheint, dass der Git-Klon KEINE Zweige außer dem Master klont. Wenn Sie "Git-Zweig -a" ausführen, zeigt dies, dass sich der Zweig "Entwickeln" nur bei "Fernbedienungen / Ursprung / Entwickeln" befindet. Dies muss bedeuten, dass Sie diesen Zweig nirgendwo lokal haben, er existiert derzeit nur am Ursprung, oder?
John Little

19

Verwenden Sie mein Tool git_remote_branch (Sie müssen Ruby auf Ihrem Computer installiert haben). Es wurde speziell entwickelt, um die Manipulation von Fernzweigen zum Kinderspiel zu machen.

Jedes Mal, wenn eine Operation in Ihrem Namen ausgeführt wird, wird sie an der Konsole rot gedruckt. Mit der Zeit bleiben sie endlich in deinem Gehirn :-)

Wenn Sie nicht möchten, dass grb Befehle in Ihrem Namen ausführt, verwenden Sie einfach die Funktion "EXPLAIN". Die Befehle werden auf Ihrer Konsole gedruckt und nicht für Sie ausgeführt.

Schließlich haben alle Befehle Aliase, um das Auswendiglernen zu erleichtern.

Beachten Sie, dass dies Alpha-Software ist ;-)

Hier ist die Hilfe, wenn Sie grb help ausführen:

git_remote_branch Version 0.2.6

  Verwendungszweck:

  grb create branch_name [origin_server] 

  grb publiziere branch_name [origin_server] 

  grb umbenennen branch_name [origin_server] 

  grb delete branch_name [origin_server] 

  grb track branch_name [origin_server] 



  Anmerkungen:
  - Wenn origin_server nicht angegeben ist, wird der Name 'origin' angenommen 
    (gits Standard)
  - Die Umbenennungsfunktion benennt den aktuellen Zweig um

  Der EXPLAIN-Meta-Befehl: Sie können jedem Befehl auch den Befehl voranstellen 
Schlüsselwort 'erklären'. Anstatt den Befehl auszuführen, git_remote_branch
gibt einfach die Liste der Befehle aus, die Sie ausführen müssen, um sie auszuführen 
dieses Ziel.

  Beispiel: 
    grb erklären erstellen
    grb EXPLAIN Erstelle my_branch Github

  Alle Befehle haben auch Aliase:
  erstellen: erstellen, neu
  löschen: löschen, zerstören, töten, entfernen, rm
  veröffentlichen: veröffentlichen, remotisieren
  umbenennen: umbenennen, rn, mv, verschieben
  track: verfolgen, folgen, greifen, holen

6
Ein Wort an die Weisen: Es sieht so aus, als ob dieses Projekt zum Zeitpunkt der Veröffentlichung dieser Antwort aufgegeben wurde. Ich kann nach 2008 keine Updates mehr finden. Vorbehalt und all das. Wenn ich falsch liege, hoffe ich, dass jemand einen aktuellen Zeiger bearbeitet und bereitstellt, da ich gerne ein solches Tool zur Hand hätte.
Bradheintz

@bradheintz überprüfen Sie diese Antwort, es wird ein Git-Alias ​​eingerichtet: stackoverflow.com/a/16563327/151841
user151841

19

Alle Antworten, die ich hier gesehen habe, sind gültig, aber es gibt eine viel sauberere Möglichkeit, ein Repository zu klonen und alle Zweige gleichzeitig abzurufen.

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


Wenn Sie jedoch ein Repo mit vielen Zweigen klonen möchten, sind alle oben dargestellten Methoden langwierig und langwierig in Bezug auf eine viel sauberere und schnellere Methode, die ich zeigen werde, obwohl sie 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.

  1. 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
  1. 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 "git branch" eingeben und 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.


Ich mag es nicht, wenn Sie das Wort "Download" in ... "manuell" einzeln herunterladen . Alle Informationen werden bereits heruntergeladen, nachdem das Repo geklont wurde. Das einzige, was man tun muss, ist das Erstellen lokaler Tracking-Zweige (was auch offline möglich ist, was beweist, dass sich alle Informationen im Repo befinden).
Bvgheluwe

@bvgheluwe deshalb steht es in Anführungszeichen.
FedericoCapaldo

15

Das Klonen von einem lokalen Repo funktioniert nicht mit git clone & git fetch: Viele Zweige / Tags bleiben nicht abgerufen.

So erhalten Sie einen Klon mit allen Zweigen und Tags.

git clone --mirror git://example.com/myproject myproject-local-bare-repo.git

So erhalten Sie einen Klon mit allen Zweigen und Tags, aber auch mit einer Arbeitskopie:

git clone --mirror git://example.com/myproject myproject/.git
cd myproject
git config --unset core.bare
git config receive.denyCurrentBranch updateInstead
git checkout master

13

OK, wenn Sie Ihr Repo klonen, haben Sie alle Zweige dort ...

Wenn Sie nur tun git branch, sind sie irgendwie versteckt ...

Wenn Sie also den Namen aller Zweige sehen möchten, fügen Sie einfach ein --allFlag wie das folgende hinzu:

git branch --all oder git branch -a

Wenn Sie nur zur Filiale auschecken, erhalten Sie alles, was Sie brauchen.

Aber wie wäre es, wenn der Zweig von jemand anderem erstellt wird, nachdem Sie geklont haben?

In diesem Fall machen Sie einfach:

git fetch

und überprüfen Sie alle Zweige erneut ...

Wenn Sie gleichzeitig abrufen und auschecken möchten, haben Sie folgende Möglichkeiten:

git fetch && git checkout your_branch_name

Außerdem haben Sie das folgende Bild erstellt, um das zu vereinfachen, was ich gesagt habe:

Git Branch - Alle, um alle Zweige zu bekommen


3
Es gibt einen Unterschied zwischen "Sie haben es" und "Sie sehen es". git branch -all listet die entfernten Zweige NICHT mehr auf, wenn Sie das entfernte Repository entfernen.
Gustave

12

Als ich mir eine der Antworten auf die Frage ansah, bemerkte ich, dass es möglich ist, sie zu verkürzen:

for branch in  `git branch -r | grep -v 'HEAD\|master'`; do  
 git branch --track ${branch##*/} $branch;
done

Aber Vorsicht, wenn einer der Remote-Zweige zB admin_master heißt, wird er nicht heruntergeladen!

Vielen Dank an Bigfish für die originelle Idee


Sie können den regulären Ausdruck verbessern oder Awk anstelle von verwenden grep, um den Filter zu verbessern und Fehlalarme zu vermeiden.
Tripleee

Alle Zweige sind 'origin \ my_branch_name', was nicht definitiv das ist, was ich will.
Sнаđошƒаӽ

Ich habe das Konstrukt $ {branch ## * /} noch nie gesehen - sieht wirklich nützlich aus - eine Idee, wo ich mehr darüber herausfinden kann? kann nirgendwo unter Bash zu finden scheinen. Danke.
SaminOz


10

Zum Kopieren und Einfügen in die Befehlszeile:

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

Für mehr Lesbarkeit:

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


Dieser Wille:

  1. check out master (damit wir den Zweig löschen können, in dem wir uns befinden)
  2. Wählen Sie die Fernbedienung zum Auschecken aus (ändern Sie sie in eine beliebige Fernbedienung).
  3. Durchlaufen Sie alle Zweige der Fernbedienung mit Ausnahme von Master und HEAD
    1. lokalen Zweig löschen (damit wir zwangsaktualisierte Zweige auschecken können)
    2. Überprüfen Sie den Zweig von der Fernbedienung
  4. check out master (um es zu tun)

Basierend auf der Antwort von VonC .


10

Ich habe diese kleinen Powershell- Funktionen geschrieben, um alle meine Git-Zweige auschecken zu können, die sich auf der Ursprungsfernbedienung befinden.

Function git-GetAllRemoteBranches {
     iex "git branch -r"                       <# get all remote branches #> `
     | % { $_ -Match "origin\/(?'name'\S+)" }  <# select only names of the branches #> `
     | % { Out-Null; $matches['name'] }        <# write does names #>
}


Function git-CheckoutAllBranches {
    git-GetAllRemoteBranches `
        | % { iex "git checkout $_" }          <# execute ' git checkout <branch>' #>
}

Weitere Git-Funktionen finden Sie in meinem Git-Einstellungen-Repo


9

Hier ist eine Antwort, die awk verwendet. Diese Methode sollte ausreichen, wenn sie für ein neues Repo verwendet wird.

git branch -r | awk -F/ '{ system("git checkout " $NF) }'

Bestehende Zweige werden einfach ausgecheckt oder als bereits darin deklariert. Es können jedoch Filter hinzugefügt werden, um Konflikte zu vermeiden.

Es kann auch so geändert werden, dass ein expliziter git checkout -b <branch> -t <remote>/<branch>Befehl aufgerufen wird.

Diese Antwort folgt Nikos C. ‚s Idee .


Alternativ können wir stattdessen den Remote-Zweig angeben. Dies basiert auf der Antwort von Murphytalk .

git branch -r | awk '{ system("git checkout -t " $NF) }'

Es wirft schwerwiegende Fehlermeldungen bei Konflikten auf, aber ich sehe sie als harmlos an.


Beide Befehle können mit einem Alias ​​versehen werden.

Wenn Sie die Antwort von niemandem als Referenz verwenden, können Sie die folgenden Befehle zum Erstellen der Aliase verwenden:

git config --global alias.clone-branches '! git branch -r | awk -F/ "{ system(\"git checkout \" \$NF) }"'
git config --global alias.clone-branches '! git branch -r | awk "{ system(\"git checkout -t \" \$NF) }"'

Persönlich würde ich track-alloder verwenden track-all-branches.


Ich wollte mich nur bei dir bedanken. Dies funktionierte perfekt und es gibt keine Probleme mit dem Klonen eines nackten Repos, wie z. B. Änderungen des Pull-Verhaltens usw.
Mahonya,

8

Ich musste genau das Gleiche tun. Hier ist mein Ruby- Skript.

#!/usr/bin/env ruby

local = []
remote = {}

# Prepare
%x[git reset --hard HEAD]
%x[git checkout master] # Makes sure that * is on master.
%x[git branch -a].each_line do |line|
  line.strip!
  if /origin\//.match(line)
     remote[line.gsub(/origin\//, '')] = line
   else
     local << line
   end
end
# Update 
remote.each_pair do |loc, rem|
  next if local.include?(loc)
  %x[git checkout --track -b #{loc} #{rem}]
end
%x[git fetch]

Siehe Antwort, die ich weiter unten gepostet habe, um zu vermeiden, dass dieses Skript überhaupt ausgeführt werden muss.
Lacostenycoder

8

Keine dieser Antworten hat es geschafft, außer dass Benutzer niemand auf dem richtigen Weg ist.

Ich hatte Probleme beim Verschieben eines Repos von einem Server / System auf einen anderen. Als ich das Repo geklont habe, wurde nur ein lokaler Zweig für den Master erstellt. Wenn ich also auf die neue Fernbedienung pushe, wurde nur der Master-Zweig gepusht.

Daher fand ich diese beiden Methoden SEHR nützlich. Hoffe, sie helfen jemand anderem.

Methode 1:

git clone --mirror OLD_REPO_URL
cd new-cloned-project
mkdir .git
mv * .git
git config --local --bool core.bare false
git reset --hard HEAD
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

Methode 2:

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
git clone OLD_REPO_URL
cd new-cloned-project
git clone-branches
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

8

git clone --mirror auf dem Original-Repo funktioniert das gut.

git clone --mirror /path/to/original.git
git remote set-url origin /path/to/new-repo.git
git push -u origin

7

Git ruft normalerweise (wenn nicht angegeben) alle Zweige und / oder Tags (Refs, siehe :) git ls-refsaus einem oder mehreren anderen Repositorys zusammen mit den Objekten ab, die zum Vervollständigen ihrer Historien erforderlich sind. Mit anderen Worten, es werden die Objekte abgerufen, die von den bereits heruntergeladenen Objekten erreichbar sind. Siehe: Was macht das git fetchwirklich?

Manchmal haben Sie möglicherweise Zweige / Tags, die nicht direkt mit dem aktuellen verbunden sind. In diesem Fall hilft git pull --all/ git fetch --allhilft dies nicht, aber Sie können sie auflisten, indem Sie:

git ls-remote -h -t origin

und holen Sie sie manuell, indem Sie die Ref-Namen kennen.

Um sie alle zu holen , versuchen Sie:

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

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

Dann überprüfen Sie noch einmal alle Ihre Filialen:

git branch -avv

Wenn dies nicht hilft, müssen Sie fehlende Zweige manuell zur nachverfolgten Liste hinzufügen (da sie irgendwie verloren gegangen sind):

$ git remote -v show origin
...
  Remote branches:
    master      tracked

von git remote set-brancheswie:

git remote set-branches --add origin missing_branch

so kann es unter remotes/originnach dem Abrufen erscheinen:

$ git remote -v show origin
...
  Remote branches:
    missing_branch new (next fetch will store in remotes/origin)
$ git fetch
From github.com:Foo/Bar
 * [new branch]      missing_branch -> origin/missing_branch

Fehlerbehebung

Wenn Sie immer noch nichts anderes als den Hauptzweig erhalten können, überprüfen Sie Folgendes:

  • Überprüfen Sie Ihre Fernbedienungen ( git remote -v), z
    • Überprüfen Sie das git config branch.master.remoteist origin.
    • Überprüfen Sie, ob originauf die richtige URL verweist über: git remote show origin(siehe diesen Beitrag ).

7

Ab Anfang 2017 funktioniert die Antwort in diesem Kommentar :

git fetch <origin-name> <branch-name>bringt den Zweig für Sie herunter. Dies zieht zwar nicht alle Zweige gleichzeitig, Sie können diesen Zweig jedoch einzeln ausführen.


Dies erfordert, dass Sie jeden Zweig einzeln abrufen. Nicht sehr gut, wenn Sie viele Zweige haben.
Lacostenycoder

6

Hier ist ein weiterer kurzer einzeiliger Befehl, der lokale Zweige für alle entfernten Zweige erstellt:

(git branch -r | sed -n '/->/!s#^  origin/##p' && echo master) | xargs -L1 git checkout

Es funktioniert auch ordnungsgemäß, wenn bereits lokale Zweigstellen erstellt wurden. Sie können es nach dem ersten git cloneoder jederzeit später aufrufen .

Wenn Sie masternach dem Klonen keinen Zweig auschecken müssen, verwenden Sie

git branch -r | sed -n '/->/!s#^  origin/##p'| xargs -L1 git checkout
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.