2013-01-21 4 views
9

Ich möchte mein Remote-Git-Repository und alle seine Zweige in ein neues Remote-Repository verschieben.Wie verschiebe ich meinen Remote-Git-Repo zu einem anderen Remote-Git-Repo?

alt remote = [email protected]:thunderrabbit/thunderrabbit.github.com.git

neue remote = [email protected]:tr/tr.newrepo.git

+0

Ich weiß, dass dies eine Frage zur Selbstbeantwortung war, aber die Frage selbst ist immer noch sehr geringe Qualität. Versuchen Sie vielleicht, einige der Ideen, die Sie ausprobiert haben, oder die Dokumentation, die Sie angeschaut haben, bevor Sie [Ihre Antwort] gefunden haben, hinzuzufügen (http://stackoverflow.com/a/14432237/456814). –

+0

FYI, [ummäutes Antwort] (http://stackoverflow.com/a/14435630/456814) ist nicht ganz korrekt, siehe [mein Kommentar] (http://stackoverflow.com/questions/14432234/how-do- i-move-mein-remote-git-repo-zu-einem-remote-git-repo # comment35718703_14435630). –

Antwort

5

Also, was keiner dieser anderen Antworten zu gut erklärt, ist, dass, wenn Sie verschieben Sie alle Ihre Remote-Repository br anch an eine neue Fernbedienung mit Git push Mechanismus, dann benötigen Sie lokale Zweig Versionen von jedem der Niederlassungen Ihrer Fernbedienung.

Sie können git branch verwenden, um lokale Verzweigungen zu erstellen. Dadurch wird ein Zweig Referenz unter Ihrem .git/refs/heads/ Verzeichnis erstellt, in dem alle Ihre lokalen Zweigverweise gespeichert sind.

Dann können Sie git push mit den --all und --tags Optionsflags verwenden:

git push <new-remote> --all # Push all branches under .git/refs/heads 
git push <new-remote> --tags # Push all tags under .git/refs/tags 

Beachten Sie, dass --all und --tags können nicht zusammen verwendet werden, ist also, warum man zweimal Push haben.

Dokumentation

Hier ist der relevante git push documentation:

--all 

Anstatt jede ref zu benennen, zu schieben gibt an, dass alle Refs unter refs/heads/ geschoben werden.

--tags 

Alle Refs unter refs/tags werden zusätzlich geschoben, bis refspecs explizit auf der Kommandozeile aufgeführt.

--mirror

Beachten Sie, dass --mirror kann auch beiden Zweige und Tag-Referenzen drücken bei einmal verwendet werden, aber das Problem mit dieser Flagge ist, dass es alle Verweise in .git/refs/ schiebt, nicht nur .git/refs/heads und .git/refs/tags, die nicht sein können, was Sie auf Ihre Fernbedienung drücken möchten.

Zum Beispiel --mirror kann Remote-Tracking-Zweig von Ihren alten entfernten (n) drücken, die unter .git/refs/remotes/<remote>/ sind, sowie andere Referenzen wie .git/refs/original/, die ein Nebenprodukt von git filter-branch ist.

9

In Terminal auf dem lokalen Computer:

cd ~ 
git clone <old-remote> unique_local_name 
cd unique_local_name 

for remote in `git branch -r | grep -v master `; \ 
do git checkout --track $remote ; done 

git remote add neworigin <new-remote> 
git push --all neworigin 
+0

Ist die letzte Zeile (git push --all gitlab) ein Tippfehler? Sollte es kein neuer Ursprung sein, nicht gitlab? –

+0

Ah ja, sieht so aus. Vielen Dank! –

+1

FYI, wenn Sie Tags drücken möchten, dann müssen Sie auch 'git push --Tags' verwenden (es kann nicht gleichzeitig mit' --all' verwendet werden). Anstatt "git checkout" zu verwenden, können Sie auch 'git branch' verwenden, was wahrscheinlich schneller ist, da Sie nicht zwischen Dateien in Ihrer Arbeitskopie wechseln. –

3

ganze Idee ist es, für jeden alten entfernten Zweig tun:

  • Kasse
  • Push auf die neue Fernbedienung ziehen (es über Tags nicht vergessen!)

wie folgt aus:

#!/bin/bash 

[email protected]:tr/tr.newrepo.git 
new_remote=new_remote 
[email protected]:thunderrabbit/thunderrabbit.github.com.git 
old_remote=origin 

git remote add ${old_remote} ${old_remote_link} 

git pull ${old_remote} 

BRANCHES=`git ls-remote --heads ${old_remote} | sed 's?.*refs/heads/??'` 

git remote add ${new_remote} ${new_remote_link} 

for branch in ${BRANCHES}; do 
    git checkout ${branch} 
    git pull ${old_remote} ${branch} 
    git push ${new_remote} ${branch} --tags 
    printf "\nlatest %s commit\n" ${branch} 
    git log --pretty=format:"(%cr) %h: %s%n%n" -n1 
done 
0

Sie können einfach die URL für Ihre origin Repository ändern:

git clone <old-remote-url> unique_local_name 
cd unique_local_name 
git pull --all 

git remote set-url origin <new-remote-url> 
git push --all 
+0

Dies ist nicht ganz richtig, wenn Sie keine lokalen Zweigversionen jeder Ihrer Remote-Zweigstellen haben, werden sie nicht auf die neue Fernstelle übertragen. Nur lokale Zweige unter '.git/refs/heads /' werden verschoben. –