2013-01-21 10 views
9

Voglio spostare il mio repository git remoto e tutte le sue diramazioni su un nuovo repository remoto.Come posso spostare il mio repo git remoto su un altro repository git remoto?

vecchio telecomando = [email protected]:thunderrabbit/thunderrabbit.github.com.git

nuovo telecomando = [email protected]:tr/tr.newrepo.git

+0

So che questa era una domanda di auto-risposta, ma la domanda in sé è ancora di qualità molto bassa. Forse prova ad aggiungere alcune delle idee che hai provato o la documentazione che hai guardato prima che ti venisse in mente [la tua risposta] (http://stackoverflow.com/a/14432237/456814). –

+0

FYI, [la risposta di umläute] (http://stackoverflow.com/a/14435630/456814) non è del tutto corretta, vedere [il mio commento] (http://stackoverflow.com/questions/14432234/how-do- i-move-my-remote-git-repo-per-altro-remote-git-repo # comment35718703_14435630). –

risposta

5

Quindi, ciò che nessuna di queste altre risposte spiega troppo bene è che se si desidera spostare tutti i file del repository remoto si arresta su un nuovo telecomando utilizzando il meccanismo push di Git , , quindi sono necessarie le versioni locali delle filiali di ciascuno dei rami del proprio telecomando .

È possibile utilizzare git branch per creare filiali locali. Verrà creato un riferimento nella directory .git/refs/heads/, in cui sono memorizzati tutti i riferimenti di diramazione locali .

Quindi è possibile utilizzare git push con le bandiere di opzione --all e --tags:

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

noti che --all e --tags non possono essere utilizzati insieme, ecco perché si deve spinta due volte.

Documentazione

Ecco il relativo git push documentation:

--all 

Invece di nominare ogni ref a spingere, specifica che tutti gli arbitri sotto refs/heads/ essere spinto.

--tags 

Tutti gli arbitri sotto refs/tags sono spinti, oltre a refspecs esplicitamente elencati sulla riga di comando.

--mirror

Si noti inoltre che --mirror può essere usata per spingere entrambi i riferimenti filiali e tag a una volta, ma il problema con questo flag è che spinge tutti i riferimenti in .git/refs/, non solo .git/refs/heads e .git/refs/tags, che potrebbe non essere ciò che si desidera inviare al telecomando.

Per esempio, --mirror può spingere i rami di monitoraggio a distanza dai vostri vecchi remoti (s) che sono sotto .git/refs/remotes/<remote>/, così come altri referenze come .git/refs/original/, che è un sottoprodotto della git filter-branch.

9

Nel terminale sulla macchina locale:

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

L'ultima riga (git push --all gitlab) è un refuso? Non dovrebbe essere una nuova origine, non gitlab? –

+0

Ah sì, sembra così. Grazie! –

+1

Per tua informazione, se vuoi spingere i tag, devi anche usare 'git push --tags' (non può essere usato contemporaneamente a' --all'). Inoltre, invece di usare 'git checkout', potresti anche usare' git branch', che probabilmente sarà più veloce, dal momento che non stai cambiando i file nella tua copia di lavoro. –

3

idea è di per ogni vecchio ramo remoto do:

  • checkout
  • tirare
  • spinta per il nuovo telecomando (non dimenticare i tag!)

Come quella:

#!/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

si può semplicemente cambiare l'URL per il repository origin:

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

Questo non è del tutto corretto, se non si dispone di versioni di diramazioni locali di ciascuna delle filiali remote, non saranno trasferite al nuovo telecomando. Solo i rami locali sotto '.git/refs/heads /' verranno spinti. –