Git Push-Zweig von einer Fernbedienung zur anderen?

133

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 korgder rorgFernbedienung verschieben. Wie mache ich das?

Vorzugsweise ohne für jeden zuerst eine lokale Verzweigung zu erstellen, wenn dies vermeidbar ist.

Bjarke Freund-Hansen
quelle
Ich vermute , die Antwort auf diese Frage ist vergleichbar mit der Antwort auf diese Frage : stackoverflow.com/questions/6922700/… .
Legolas

Antworten:

52

Ein schneller Test zum Erstellen einiger temporärer Repositorys zeigt, dass Sie eine Referenzspezifikation erstellen können, die dies kann:

$ git push rorg origin/one:refs/heads/one
Counting objects: 5, done.
Writing objects: 100% (3/3), 240 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /tmp/rorg
 * [new branch]      origin/one -> one

Also Herkunft / BRANCHNAME: Refs / Heads / BRANCHNAME

Einchecken meiner rorgFernbedienung:

pat@host /tmp/rorg (BARE:master)
$ git graph --all
* 5750bca (HEAD, master) c
| * 13fd55a (one) b
|/
* 822e0de a
Patthoyts
quelle
5
Warum nicht stattdessen git push rorg origin/one:one(ohne refs/heads/)?
Ali
2
@exalted, weil Sie mit refs/heads/Präfix Remote-Verzweigung drücken, die nicht in eineone
ДМИТРИЙ МАЛИКОВ
@patthoyts Ich habe den erwähnten Befehl ausprobiert, der besagt, dass alles auf dem neuesten Stand ist. Aber ich habe 10 Zweige in Remote A und 6 Zweige in Remote B. Können Sie mir bitte sagen, wie ich die ausgelassenen Zweige verschieben kann?
Keshav1234
219

Ich habe diesen gefunden:

git push rorg 'refs/remotes/korg/*:refs/heads/*'

Und es schob alle meine entfernten Zweige von Korg zu Rorg (auch ohne lokale Kopien der Zweige). Siehe die Ausgabe unten:

Counting objects: 293, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (67/67), done.
Writing objects: 100% (176/176), 48.32 KiB, done.
Total 176 (delta 105), reused 168 (delta 97)
remote: Resolving deltas:  11% (12/105)
To <<MY_REPOSITORY_URL>>
 * [new branch]      korg/gingerbread-> gingerbread
 * [new branch]      korg/gingerbread-release -> gingerbread-release
 * [new branch]      korg/honeycomb-> honeycomb
 * [new branch]      korg/HEAD -> HEAD
 * [new branch]      korg/honeycomb-mr1-release-> honeycomb-mr1-release
 * [new branch]      korg/master -> master

Und dann können Sie den gleichen Druck auf tagsSchiedsrichter ausüben:

git push rorg 'refs/tags/*:refs/tags/*'
Radistao
quelle
2
In neu genug (welche Version?) Von git sollte dies die akzeptierte Antwort sein. @ bjarke-freund-hansen Möchten Sie die akzeptierte Antwort ändern, wenn Sie zum Nutzen zukünftiger Sucher zustimmen?
Jonah Graham
1
"In neu genug (welche Version?) Von git sollte dies die akzeptierte Antwort sein", wie ich weiß, sollte dies für jede öffentliche git-Version funktionieren, da diese Push-Signatur- und Referenz-Platzhalter üblich sind
radistao
3
Gibt mir Everything up-to-dateauf Git 2.10.0, dass nichts passiert, während das Gleiche auf einzelnen Zweigen funktioniert.
user239558
6
Ich dachte nur, ich sollte das ausrufen: Diese Methode scheint einen tatsächlichen Zweig auf der aufgerufenen Fernbedienung zu erstellen HEAD. Das kann aber gelöscht werden. git push rorg :HEAD
Mark Stickley
1
Wenn Sie mit der Refs-Struktur nicht vertraut sind und sich fragen, wie Sie die Tags verschieben sollen, möchten Sie diesen Befehl : git push rorg refs/tags/*:refs/tags/*. Welches ist das gleiche wie git push rorg --tags, aber es ist gut zu verstehen, was diese Dinge tun :)
Mark Stickley
14

Um Patthoyts Antwort zu ergänzen , gibt es hier ein kurzes Shell-Skript, das alle Zweige von einer Fernbedienung zur anderen verschiebt:

SRC_REMOTE=korg
DST_REMOTE=rorg
for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->')
  do git push "$DST_REMOTE" "$a:refs/heads/${a//$SRC_REMOTE\/}"
done

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, dh origin/masterwird master.)

blahdiblah
quelle
3
für diejenigen von uns, die es in einem Stoß tun müssen: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)
Jayen
3

Dies funktioniert in Zsh

git push rorg 'refs/remotes/korg/*:refs/heads/*'
zhudongfang
quelle
Es tut mir leid, dass ich es abgelehnt habe, aber Ihre Antwort ist identisch mit der obigen Antwort von radistao ( stackoverflow.com/a/21133502/235878 ), die in '14 veröffentlicht wurde.
Patrick
0

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

SRC_R=origin1
DEST_R=origin2
for cbranch in $(git branch -r | grep $SRC_R | cut -d '/' -f2,3,4,5 | cut -d ' ' -f1)
do
    git checkout $cbranch
    git push $DEST_R $cbranch
done

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

git config [--global] credential.helper wincred

Für Linux

git config [--global] credential.helper cache

Wobei [--global] bedeutet, optional --global hinzuzufügen

Wenn Sie die Fernverfolgung für alle Zweige auf eine neue Fernbedienung einstellen möchten:

DEST_R=remotename
for cbranch in `git branch`
do
    git checkout $cbranch
    git branch -u guru/$cbranch
done

Als .sh-Datei gespeichert und mit "sh filename.sh" ausgeführt, werden alle Upstreams so eingestellt, dass sie den Remote-Remotenamen verfolgen.

csga5000
quelle
0

Aufgrund des zusätzlichen HEADZweigs, 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:

git clone --bare <from-repository>
cd <from-repo-dir>
git push --set-upstream <to-repository> --all
git push --set-upstream <to-repository> --tags
Kurt Vangraefschepe
quelle