Ich habe ein Git-Repository geklont, das ungefähr fünf Zweige enthält. Wenn ich das tue, sehe git branch
ich jedoch nur einen von ihnen:
$ git branch
* master
Ich weiß , dass ich tun kann , git branch -a
um 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...
git
branch
git-branch
David542
quelle
quelle
--single-branch
Einstellung beim Klonen verwendet wurde: stackoverflow.com/questions/17714159/… (git fetch --all
funktioniert nie, wenn Sie nur einen Zweig angegeben haben!)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), danngit config --bool core.bare false
(setzt das "nackte" Flag auf false), danngit reset --hard
(verschiebt den KOPF auf den aktuellen KOPF im Repo). Wenn Siegit branch
nun alle Zweige des von Ihnen geklonten Repos sehen sollten.Antworten:
Sie können alle Zweige von allen Fernbedienungen wie folgt abrufen:
Es ist im Grunde eine Kraftbewegung .
fetch
aktualisiert lokale Kopien von Remote-Filialen, sodass dies für Ihre lokalen Filialen immer sicher ist, ABER :fetch
aktualisiert keine lokalen Zweige (die entfernte Zweige verfolgen ); Wenn Sie Ihre lokalen Zweige aktualisieren möchten, müssen Sie dennoch jeden Zweig abrufen.fetch
nicht 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:
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
:TL; DR-Version
(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 --all
undgit remote update
sind gleichwertig.Kamil Szots Kommentar , den die Leute nützlich fanden.
quelle
git checkout -b localname remotename/remotebranch
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.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.for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all
So listen Sie entfernte Zweige auf:
git branch -r
Sie können sie als lokale Niederlassungen auschecken mit:
git checkout -b LocalName origin/remotebranchname
quelle
git checkout remotebranchname
und es funktioniert. Was ist der Unterschied zu Ihrer Lösung?git checkout remotebranchname
verwendet, um nur einen neuen, nicht verwandten Zweig mit dem Namen remotebranchname zu erstellen .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:Danach
git fetch --all
werden alle lokalen Kopien der Remote-Zweige aktualisiert.Außerdem
git pull --all
wird 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.quelle
git pull --all
alle lokalen Tracking-Zweige aktualisiert werden? Soweit ich das beurteilen kann, wird nur der aktuelle Zweig von allen Fernbedienungen aktualisiert.origin
? Siehe diese Antwort, die für alle Remote-Namen funktioniert.Wenn Sie tun:
dann werden sie alle vor Ort sein. Wenn Sie dann ausführen:
Sie sehen sie als Fernbedienungen / Ursprung / Filialname. Da sie vor Ort sind, können Sie mit ihnen machen, was Sie wollen. Zum Beispiel:
oder
oder
quelle
--all
git fetch -all
holt alle Zweige aller Fernbedienungen.git fetch origin
holt alle Zweige der Fernbedienungorigin
. Letzteres hat das OP gefragt.--all
bedeutet "alle Fernbedienungen", nicht "alle Zweige einer bestimmten Fernbedienung". Letzteres wird durch jeden Abruf von einer Fernbedienung impliziert.Dies setzt voraus, dass alle Zweige verfolgt werden.
Wenn dies nicht der Fall ist, können Sie dies in Bash abfeuern:
Führen Sie dann den Befehl aus.
quelle
->
den wahrscheinlich in der Ausgabe vongit branch -r
"origin / HEAD -> origin / master"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.git fetch
funktionierte nicht. Die Lektion hier ist also, dass Sie die entfernten Zweige verfolgen müssen. Gracias!Die Bash-
for
Schleife funktionierte bei mir nicht, aber das tat genau das, was ich wollte. Alle Zweige meiner Herkunft wurden lokal als gleichnamig gespiegelt.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.
quelle
fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository
nach einem einfachen Klon. Müssen Kopf zuerst abnehmen. Ich tat dies mitgit checkout <SHA>
git checkout --detach # detach the head
und danngit fetch origin \'+refs/heads/*:refs/heads/*
Verwenden Sie
git fetch && git checkout RemoteBranchName
.Es funktioniert sehr gut für mich ...
quelle
origin/branch
, es genügt nur zu sagenbranch
).Wenn Sie ein Repository klonen, werden alle Informationen der Zweige tatsächlich heruntergeladen, aber die Zweige werden ausgeblendet. Mit dem Befehl
Sie können alle Zweige des Repositorys und mit dem Befehl anzeigen
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:
Erster Schritt
Erstellen Sie einen neuen leeren Ordner auf Ihrem Computer und klonen Sie eine Spiegelkopie des .git-Ordners aus dem Repository:
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.
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:
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.
Jetzt können Sie einfach den Befehl eingeben
git branch
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.
quelle
Sie können alle Zweige abrufen, indem Sie:
oder:
Der
--depth=10000
Parameter kann hilfreich sein, wenn Sie ein flaches Repository haben.Verwenden Sie zum Ziehen aller Zweige:
Wenn dies nicht funktioniert, stellen Sie dem obigen Befehl Folgendes voran:
da das
remote.origin.fetch
beim 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:
schließlich
--mirror
alle refs spiegeln.Wenn Sie ein Repository duplizieren möchten, lesen Sie: Duplizieren eines Repository- Artikels bei GitHub.
quelle
depth=1
) verwendet und die Konfiguration hat auch einen bestimmten Zweig für angegebenfetch
- derdepth=1000
Parameter war der Fix, der mir geholfen hat, einen bestimmten Remote-Zweigpull --all
zieht nicht alle Zweige, sondern alle FernbedienungenNormalerweise benutze ich nichts anderes als Befehle wie diesen:
Eine etwas kürzere Version:
quelle
Ich glaube, Sie haben das Repository geklont durch:
Gehen Sie nun mit cd in diesen Ordner:
Wenn Sie tippen
git status
, können Sie alle sehen:So zeigen Sie alle versteckten Verzweigungstypen an:
Es werden alle Remote-Zweige aufgelistet.
Wenn Sie nun in einem bestimmten Zweig auschecken möchten, geben Sie einfach Folgendes ein:
quelle
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.
quelle
git fetch git pull
Siepull
macht zwar einefetch
erste, aber es ist einfacher zu erkennen, ob das Problem von demfetch
Teilpull
oder dem nachfolgendenmerge
Teil stammt,pull
wennfetch
es unabhängig ausgeführt wird.Nachdem Sie das Master-Repository geklont haben, können Sie es einfach ausführen
quelle
Stellen Sie sicher, dass alle Remote-Zweige in einer
.git/config
Datei abgerufen werden können.In diesem Beispiel kann nur der
origin/production
Zweig abgerufen werden, auch wenn Sie versuchen, nichtsgit fetch --all
anderes zu tun , als den Zweig abzurufenproduction
:Diese Zeile sollte ersetzt werden durch:
Dann laufen
git fetch
etc ...quelle
git config --get remote.origin.fetch
und dann (destruktiv) einzustellen:git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
Looping schien für mich nicht zu funktionieren und ich wollte Origin / Master ignorieren. Folgendes hat bei mir funktioniert.
Nachdem:
quelle
grep | awk
Antipattern :git branch -r | awk -F 'origin/' '!/HEAD|master/{
...Nur diese drei Befehle erhalten alle Zweige:
quelle
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.Warum beantwortet niemand die Frage der Jungs und erklärt, was passiert?
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 wirdgit branch -r
.Mach es mit einem Bash-Skript
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.
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.
quelle
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 :
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:Es klont wie gewohnt, erstellt jedoch lokale Tracking-Zweige für alle Remote-Zweige.
quelle
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:
Erläuterung:
Der Einzeiler checkt aus und holt dann alle Zweige außer HEAD.
Listen Sie die Remote-Tracking-Zweige auf.
KOPF ignorieren.
Nehmen Sie den Filialnamen von den Fernbedienungen ab.
Kasse aller Filialen, die eine einzelne Fernbedienung verfolgen.
Für ausgecheckten Zweig abrufen.
Technisch wird der Abruf für neue lokale Niederlassungen nicht benötigt.
Dies kann entweder für
fetch
oder fürpull
Zweige 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.
Vor
Überprüfen Sie die Filialen vor Ort.
Befehle ausführen
Führen Sie den einen Liner aus.
Nach
Überprüfen Sie, ob lokale Zweige Remote-Zweige enthalten.
quelle
Für Windows-Benutzer, die PowerShell verwenden:
quelle
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" } }
Folgendes würde ich als robust betrachten:
HEAD
zu verfolgenorigin/HEAD
origin
Es ist nicht notwendig , um
git fetch --all
die Weitergabe-all
angit pull
Pässen diese Option , um die internenfetch
.Gutschrift auf diese Antwort .
quelle
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.
quelle
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:
quelle
Wenn Sie Probleme mit haben,
fetch --all
verfolgen Sie Ihren Remote-Zweig:quelle
Um die Fehlermeldung 'fatal' zu vermeiden: Ein Zweig mit dem Namen 'origin / master' existiert bereits. 'Benötigen Sie Folgendes:
quelle
Basierend auf der Antwort von Learath2 habe ich Folgendes getan, nachdem ich es getan
git clone [...]
undcd
in 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.
quelle
Jetzt vor Ort bist du
yourNewLocalBranchName
deinrequiredRemoteBranch
.quelle
Für Visual Studio-Benutzer in der Package Manager-Konsole:
Git-Zweig | % {git fetch upstream; Git Merge Upstream / Master}
quelle
Habe viele Möglichkeiten ausprobiert, nur diese ist einfach und funktioniert für mich.
quelle
Alias festlegen: (basierend auf der Top-Antwort)
Um nun alle Zweige zu verfolgen:
git track-all-branches
quelle