156 Stimmen

Git-Push-Zweig von einem Remote zu einem anderen?

Ich habe die folgenden 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 Ich möchte alle entfernten Zweige von korg a la rorg entfernt. Wie kann ich das tun?

Vorzugsweise, ohne vorher eine lokale Zweigstelle zu errichten, wenn sich dies vermeiden lässt.

251voto

radistao Punkte 13753

Ich habe das hier gefunden:

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

Und es hat alle meine Remote-Zweige von korg nach rorg verschoben (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 Vorstoß machen für tags Verweise:

git push rorg 'refs/tags/*:refs/tags/*'

60voto

patthoyts Punkte 30898

Ein kurzer Test, bei dem einige temporäre Repositories erstellt wurden, zeigt, dass man eine refspec konstruieren kann, die dies ermöglicht:

$ 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 origin/BRANCHNAME:refs/heads/BRANCHNAME

Einchecken in meinem rorg entfernt:

pat@host /tmp/rorg (BARE:master)
$ git graph --all
* 5750bca (HEAD, master) c
| * 13fd55a (one) b
|/
* 822e0de a

13voto

blahdiblah Punkte 31920

Zur Ergänzung patthoyt's Antwort Hier ist ein kurzes Shell-Skript, das alle Zweige von einem entfernten Rechner zum 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 entfernten Zweig auf der Quellseite (mit Ausnahme von "Zeiger"-Zweigen wie HEAD), dieser Ref auf die Zielseite geschoben wird. (Die ${a//$SRC_REMOTE\/} Bit entfernt den Namen der entfernten Quelle aus dem Zweignamen, d.h., origin/master wird master .)

7voto

zhudongfang Punkte 194

Dies funktioniert in Zsh

Beachten Sie, dass das einfache Anführungszeichen notwendig ist, um in einigen Fällen eine unerwartete Erweiterung der Parameter zu verhindern.

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

-1voto

csga5000 Punkte 3816

Für jedes Skript, das ich Ihnen vorschlage, wäre es ratsam, alle Änderungen zu speichern oder zu übertragen.

Ich musste mehrere Zweige von einem entfernten Standort zu einem anderen verschieben. Diese Antworten setzten voraus, dass die lokalen Zweige bereits 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 Quell-Fernleitung und origin2 in die Ziel-Fernleitung. Kopieren Sie dies in "remoteBranchCloner.sh" und rufen Sie es mit "sh callBranchCloner.sh" auf.

Möglicherweise gibt es eine besser Weise, das tut nicht mehrere Schübe.

Wenn Sie meinen Code verwenden, sollten Sie wahrscheinlich Zwischenspeicherung von Anmeldeinformationen, sonst müssen Sie Ihre Anmeldedaten mehrmals eingeben.

Für Windows :

Anmerkung: Dieses Skript ist für Linux . Wenn Sie es in "git bash" ausführen funktioniert das Skript, aber Sie können es nicht von der nativen Konsole aus 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, dass optional --global hinzugefügt wird

Wenn Sie die Fernverfolgung für alle Zweigstellen 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 auf den entfernten 'remotename' eingestellt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X