Ich habe folgende Fernbedienungen eingerichtet:
$ git remote
korg
rorg
Und die folgenden Zweige:
$ git branch -a
* (no branch)
remotes/korg/gingerbread
remotes/korg/gingerbread-release
remotes/korg/honeycomb
remotes/korg/honeycomb-mr1-release
remotes/korg/master
remotes/m/android-2.3.3_r1 -> refs/tags/android-2.3.3_r1a
remotes/m/gingerbread -> korg/gingerbread
Jetzt möchte ich alle entfernten Zweige von korg
der rorg
Fernbedienung verschieben. Wie mache ich das?
Vorzugsweise ohne für jeden zuerst eine lokale Verzweigung zu erstellen, wenn dies vermeidbar ist.
git
git-branch
git-push
git-remote
Bjarke Freund-Hansen
quelle
quelle
Antworten:
Ein schneller Test zum Erstellen einiger temporärer Repositorys zeigt, dass Sie eine Referenzspezifikation erstellen können, die dies kann:
Also Herkunft / BRANCHNAME: Refs / Heads / BRANCHNAME
Einchecken meiner
rorg
Fernbedienung:quelle
git push rorg origin/one:one
(ohnerefs/heads/
)?refs/heads/
Präfix Remote-Verzweigung drücken, die nicht in eineone
Ich habe diesen gefunden:
Und es schob alle meine entfernten Zweige von Korg zu Rorg (auch ohne lokale Kopien der Zweige). Siehe die Ausgabe unten:
Und dann können Sie den gleichen Druck auf
tags
Schiedsrichter ausüben:quelle
Everything up-to-date
auf Git 2.10.0, dass nichts passiert, während das Gleiche auf einzelnen Zweigen funktioniert.HEAD
. Das kann aber gelöscht werden.git push rorg :HEAD
git push rorg refs/tags/*:refs/tags/*
. Welches ist das gleiche wiegit push rorg --tags
, aber es ist gut zu verstehen, was diese Dinge tun :)Um Patthoyts Antwort zu ergänzen , gibt es hier ein kurzes Shell-Skript, das alle Zweige von einer Fernbedienung zur anderen verschiebt:
Zusammenfassend lässt sich sagen, dass für jeden Remote-Zweig auf der Quell-Remote (mit Ausnahme von "Zeiger" -Zweigen wie HEAD) dieser Verweis auf die Ziel-Remote verschoben wird. (Das
${a//$SRC_REMOTE\/}
Bit entfernt den Namen der Quellfernbedienung vom Verzweigungsnamen, dhorigin/master
wirdmaster
.)quelle
git push -u $DST_REMOTE $(for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->'); do echo "$a:refs/heads/${a//$SRC_REMOTE\/}"; done)
Dies funktioniert in Zsh
quelle
Für jedes Skript, das Sie ausführen sollen, ist es ratsam, alle Ihre Änderungen zu speichern oder festzuschreiben.
Ich musste mehrere Zweige von einer Fernbedienung zur anderen schieben. Diese Antworten erforderten, dass die lokalen Niederlassungen zuvor existierten
Ändern Sie einfach origin1 in die Quellfernbedienung und origin2 in die Zielfernbedienung. Kopieren Sie dies in "remoteBranchCloner.sh" und rufen Sie es mit "sh callBranchCloner.sh" auf.
Es kann einen besseren Weg geben, der nicht mehrere Stöße ausführt.
Wenn Sie meinen Code verwenden, möchten Sie wahrscheinlich das Caching von Anmeldeinformationen verwenden, andernfalls müssen Sie Ihre Anmeldeinformationen mehrere Male eingeben.
Für Fenster :
Hinweis: Dieses Skript ist für Linux . Wenn Sie es in "git bash" ausführen, funktioniert das Skript, aber Sie können es nicht über die native Konsole ausführen, ohne etwas Besonderes installiert zu haben.
Für Linux
Wobei [--global] bedeutet, optional --global hinzuzufügen
Wenn Sie die Fernverfolgung für alle Zweige auf eine neue Fernbedienung einstellen möchten:
Als .sh-Datei gespeichert und mit "sh filename.sh" ausgeführt, werden alle Upstreams so eingestellt, dass sie den Remote-Remotenamen verfolgen.
quelle
Aufgrund des zusätzlichen
HEAD
Zweigs, der in der vorherigen Antwort erstellt wurde , besteht die sauberste Methode darin, in ein nacktes Repository zu klonen und dann alle Zweige wie folgt auf die Fernbedienung zu übertragen:quelle