Ich habe ein lokales Git-Repo, das ich auf ein neues Remote-Repo übertragen möchte (brandneues Repo, das auf Beanstalk eingerichtet wurde, falls dies wichtig ist).
Mein lokales Repo hat einige Filialen und Tags, und ich möchte meine gesamte Geschichte behalten.
Es sieht so aus, als müsste ich im Grunde nur eine machen git push
, aber das lädt nur den master
Zweig hoch .
Wie kann ich alles pushen, damit ich eine vollständige Kopie meines lokalen Repos auf der Fernbedienung erhalte?
Antworten:
Verwenden Sie eine der folgenden Optionen, um alle Ihre Zweige zu verschieben (ersetzen Sie REMOTE durch den Namen der Fernbedienung, z. B. "Ursprung"):
So pushen Sie alle Ihre Tags :
Schließlich denke ich, dass Sie dies alles in einem Befehl tun können mit:
--mirror
Darüber hinaus werden jedoch auch Ihre Fernbedienungen gepusht, sodass dies möglicherweise nicht genau das ist, was Sie möchten.quelle
--all
statt*:*
scheint freundlichergit push REMOTE --all
zurückgegebenNo refs in common and none specified;
nichts zu tun., Währendgit push REMOTE "*:*
tatsächlich alle Zweige auf Remote geschoben.git clone --mirror old-remote-url; cd repo.git; git push --mirror new-remote-url
.In dem Fall wie mir, dass Sie ein Repo erworben haben und jetzt den Remote-Ursprung auf ein anderes Repo umstellen, ein neues leeres ...
Sie haben also Ihr Repo und alle Zweige im Inneren, aber Sie müssen diese Zweige noch auschecken, damit der
git push --all
Befehl diese auch tatsächlich pusht.Sie sollten dies tun, bevor Sie drücken:
gefolgt von
quelle
git push '*:*'
schob alle Äste.git push -all
schob nur den Meister. Ich transportierte Repo vom Github zum Bitbucket.--track remotes/$remote
statt--track $remote
. Hier ist die komplette Befehlszeile:for remote in `git branch -r | grep -v master `; do git checkout --track remotes/$remote ; done
Hier ist eine weitere Einstellung derselben Sache, die für die Situation, in der ich mich befand, besser funktioniert hat. Sie löst das Problem, wenn Sie mehr als eine Fernbedienung haben und alle Zweige in Fernbedienung
source
zu Fernbedienung klonen möchtendestination
, ohne sie jedoch alle vorher überprüfen zu müssen.(Das Problem, das ich mit Daniels Lösung hatte, war, dass es sich weigerte, einen Tracking-Zweig von der
source
Fernbedienung auszuchecken, wenn ich ihn zuvor bereits ausgecheckt hatte, dh, dass mein lokaler Zweig vor dem Push nicht aktualisiert wurde.)Dadurch werden alle Zweige in der Ferne
source
zu einem Hauptzweig hineingeschobendestination
, möglicherweise wird ein nicht schneller Vorlauf ausgeführt. Sie müssen Tags immer noch separat pushen.quelle
remote
zum anderen geklont . Vielen Dank!git push destination +refs/remotes/source/\*:refs/heads/\*
--prune
Option.--mirror
Parametern unterscheidet, die jeder empfiehlt. Funktioniert perfekt für Szenarien, in denen Sie nur zwei Fernbedienungen für Automatisierungs- oder Überwachungszwecke synchronisieren möchten.Dies ist der prägnanteste Weg, den ich gefunden habe, vorausgesetzt, das Ziel ist leer. Wechseln Sie in einen leeren Ordner und dann:
Ersatz
https://...
fürfile:///your/repo
usw. als angemessen.quelle
Die Manpage für
git-push
ist eine Lektüre wert. In Kombination mit dieser Website habe ich Folgendes in meine geschrieben.git/config
:Die
push = :
Mittel „drücken jede‚Matching‘Äste (dh Zweige , die bereits in dem entfernten Repository vorhanden und haben eine lokale Gegenstück)“ bezeichnet , währendpush = refs/tags/*
bedeutet „alle Tags Push“.Jetzt muss ich nur noch laufen
git push
, um alle passenden Zweige und alle Tags zu pushen.Ja, dies ist nicht ganz das, was das OP wollte (alle zu schiebenden Zweige müssen bereits auf der Remote-Seite vorhanden sein), könnte aber für diejenigen hilfreich sein, die diese Frage finden, während sie nach "Wie schiebe ich Zweige und Tags gleichzeitig?" Zeit".
quelle
In meinem Fall hat was funktioniert.
quelle
origin
ist ein Alias für das Remote-URL-Git-Repository.Ein Repository spiegeln
Erstellen Sie einen nackten Klon des Repositorys.
Mirror-Push in das neue Repository.
Entfernen Sie das temporäre lokale Repository, das Sie in Schritt 1 erstellt haben.
Spiegeln eines Repositorys, das Git Large File Storage-Objekte enthält
Erstellen Sie einen nackten Klon des Repositorys. Ersetzen Sie den Beispielbenutzernamen durch den Namen der Person oder Organisation, der das Repository gehört, und ersetzen Sie den Beispielrepository-Namen durch den Namen des Repositorys, das Sie duplizieren möchten.
Navigieren Sie zu dem gerade geklonten Repository.
Ziehen Sie die Git Large File Storage-Objekte des Repositorys ein.
Mirror-Push in das neue Repository.
Schieben Sie die Git Large File Storage-Objekte des Repositorys auf Ihren Spiegel.
Entfernen Sie das temporäre lokale Repository, das Sie in Schritt 1 erstellt haben.
Die obigen Anweisungen stammen aus der Github-Hilfe: https://help.github.com/articles/duplicating-a-repository/
quelle
Ich fand oben Antworten haben noch einige unklare Dinge, die Benutzer irreführen werden. Erstens, es ist sicher , dass
git push new_origin --all
undgit push new_origin --mirror
nicht alle Zweige der Herkunft duplizieren, duplizieren nur Ihre lokale existierten Zweige zu Ihrem new_origin.Im Folgenden sind zwei nützliche Methoden aufgeführt, die ich getestet habe:
1, durch Klon Bare Repo duplizieren. Geben Sie
git clone --bare origin_url
dann den Ordner ein, und.git push new_origin_url --mirror
Auf diese Weise können Sie auchgit clone --mirror origin_url
beide verwenden--bare
und--mirror
ein nacktes Repo ohne Arbeitsbereich herunterladen. Bitte beziehen Sie sich darauf2, Wenn Sie ein Git-Repo haben, indem Sie verwenden
git clone
, was bedeutet, dass Sie nackten Repo und Git-Arbeitsbereich haben, können Siegit remote add new_origin new_origin_url
und danngit push new_origin +refs/remotes/origin/\*:refs/heads/\*
und dann verwendengit push new_origin --tags
Auf diese Weise erhalten Sie einen zusätzlichen Kopfast, der keinen Sinn ergibt.
quelle
So verschieben Sie Zweige und Tags (aber keine Fernbedienungen):
Dies wäre gleichbedeutend mit der Kombination von
--tags
und--all
Optionen fürgit push
, was Git nicht zuzulassen scheint.quelle
+refs/remotes/source/*
Basierend auf @ Daniel Antwort habe ich getan:
quelle
| grep -v master
kann ersetzt werden durch| sed 's/\*//'
(ich gehe davon aus, dass Sie ausgeschlossen habenmaster
, um das böse Wenige zu vermeiden*
, das dem aktuell ausgewählten Zweig vorangestellt ist), wodurch Siemaster
Probleme einschließen und vermeiden können, wennmaster
es sich nicht um Ihren aktuell ausgewählten Zweig handelt. Es tut mir auch leid für die Nekropostierung, es ist nur so, dass diese Antwort mir heute geholfen hat und ich wollte meine Modifikation teilen, wenn sie anderen in meiner Position helfen kann ...Ich stellte fest, dass keines davon für mich richtig zu funktionieren schien. Fühlen Sie sich frei, dies zu Tode zu flammen, aber aus irgendeinem Grund konnten die anderen Optionen nicht richtig funktionieren.
Das erwartete Ergebnis war ein Repo, das auf eine andere Fernbedienung "geklont" wurde (dh von Github zu einem anderen Anbieter):
Das Hauptproblem, das ich sah, war, dass entweder nicht alle Remote-Zweige in der neuen Remote neu erstellt wurden. Wenn dies der Fall war, verfügte die neue Fernbedienung nicht über den Verzweigungsverlauf (dh, bei einem Befehl werden
git checkout branch; git log
die erwarteten Verzweigungs-Commits nicht angezeigt).Mir ist aufgefallen, dass
git checkout -b branchname
es NICHT dasselbe ist wiegit checkout branchname
(letzteres ist das, was ich brauchte). Mir ist aufgefallengit checkout --track branchname
, dass der Zweigverlauf nicht angezeigt wurde.Meine Lösung (Powershell-basiert):
quelle
Mit dem folgenden Befehl werden alle Zweige verschoben ( einschließlich derjenigen, die Sie noch nie ausgecheckt haben, die aber in Ihrem Git-Repo vorhanden sind. Sie können sie sehen, indem Sie
git branch -a
)git push origin '*:*'
quelle
Ich war gerade dabei, von einem Versionskontrolldienst zu einem anderen zu wechseln, und musste alle Repositorys einschließlich aller Zweige, Tags und des Verlaufs klonen.
Um oben zu erreichen, tat ich als nächstes:
git push origin '*:*'
.sh-Skript zum Auschecken aller Zweige in das lokale Repository:
quelle