webentwicklung-frage-antwort-db.com.de

Git Push-Zweig von einer Fernbedienung zur anderen?

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

Nun Ich möchte alle Remote-Zweige von korg auf die rorg -Remote pushen. Wie mache ich das?

Am besten ohne eine lokale Verzweigung für jede erste, wenn dies vermeidbar ist.

112

Ein kurzer Test, der einige temporäre Repositorys erstellt, zeigt, dass Sie eine Referenzspezifikation erstellen können, 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 meiner rorg -Remote:

[email protected] /tmp/rorg (BARE:master)
$ git graph --all
* 5750bca (HEAD, master) c
| * 13fd55a (one) b
|/
* 822e0de a
43
patthoyts

Ich habe folgendes gefunden:

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

Und alle meine abgelegenen Filialen wurden von Korg zu Rorg verschoben (auch ohne lokale Kopien der Filialen). 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 Push für tags refs ausführen:

git Push rorg 'refs/tags/*:refs/tags/*'
198
radistao

Als Ergänzung zu patthoyts Antwort ist hier ein kurzes Shell-Skript, das alle Zweige von einer Fernbedienung zur anderen pusht:

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 Quellfernbedienung (mit Ausnahme von "Zeiger" -Zweigen wie HEAD) diese Referenz auf die Zielfernbedienung übertragen wird. (Das ${a//$SRC_REMOTE\/}-Bit entfernt den entfernten Quellennamen vom Verzweigungsnamen, d. h. Origin/master wird master.)

14
blahdiblah

Dies funktioniert in Zsh

git Push rorg 'refs/remotes/korg/*:refs/heads/*'
4
Dongfang Zhu

Aufgrund des zusätzlichen Zweigs HEAD, der im vorherigen answer erstellt wurde, ist das Klonen in ein nacktes Repository der sauberste Weg, den ich gefunden habe, und dann das Weiterleiten aller Zweige an die Fernbedienung wie folgt :

git clone --bare <from-repository>
cd <from-repo-dir>
git Push --set-upstream <to-repository> --all
git Push --set-upstream <to-repository> --tags
0

Für jedes Skript, das ich vorschlage, dass Sie ausführen, ist es ratsam, alle Ihre Änderungen zu speichern oder festzuschreiben.

Ich musste mehrere Zweige von einer Fernbedienung zu einer anderen verschieben. 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 mehrmals drücken

Wenn Sie meinen Code verwenden, möchten Sie wahrscheinlich Zwischenspeichern von Anmeldeinformationen verwenden, andernfalls müssen Sie Ihre Anmeldeinformationen mehrmals eingeben.

Für Windows:

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

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-Remotennamen verfolgen.

0
csga5000