Come migrare il repository GIT da un server a uno nuovo


264

Ho un server che sto smontando. L'unica cosa che mi rimane da migrare è il mio repository. Questo server è elencato come origine (master) per uno dei miei progetti. Qual è il modo corretto di spostare il repository per conservare la cronologia.


Tutte le informazioni (origine, trunk, ecc.) Sul repository sono archiviate in una cartella denominata '.git', in cui si sta inizializzando il repository. Quindi, è necessario copiare i contenuti sul nuovo server, usando le istruzioni fornite qui
Mansab Uppal

1
semplicemente git config remote.origin.url newURL vedere stackoverflow.com/questions/3011402/...
Niels

1
Se desideri migrare il tuo repository e tutte le filiali utilizzano la risposta di jzwiener o Roberto anziché la risposta accettata.
jonaglon,

Risposte:


247

Per aggiungere la nuova posizione del repository,

git remote add new_repo_name new_repo_url

Quindi spingere il contenuto nella nuova posizione

git push new_repo_name master

Finalmente rimuovi quello vecchio

git remote rm origin

Dopodiché puoi fare quello che ha detto bdonlan e modificare il file.git / config per cambiare il nome_nome_punto in origine. Se non si rimuove l'origine (repository remoto originale), è possibile semplicemente inviare le modifiche al nuovo repository con

git push new_repo_name master

8
Questo copierebbe solo un singolo ramo dal vecchio repository a quello nuovo?
Andrew Grimm,

34
Qual è la soluzione per migrare tutti i rami?
emmby,

50
Dovresti essere in grado di spingere tutti i rami contemporaneamente tramite git push -u new_repo_name --all.
rmarscher,

10
La migrazione di tutti i rami sono disponibili all'indirizzo stackoverflow.com/a/18336145/923599
jzwiener

10
Invece di modificare il file git-config, questo comando ha funzionato per me:git remote rename new_repo_name origin
Salim

210

Se desideri migrare tutti i rami e i tag, dovresti usare i seguenti comandi:

git clone --mirror [oldUrl]

clonare il vecchio repository con tutti i rami

cd the_repo
git remote add remoteName newRepoUrl

per configurare un nuovo telecomando

git push -f --tags remoteName refs/heads/*:refs/heads/*

spingere tutti i ref sotto ref / head (che è probabilmente quello che vuoi)


5
Git si lamentava --tagse refs/heads/*:refs/heads/*non è compatibile con --mirror. stackoverflow.com/a/26552740/1484831 ha funzionato bene.
Avigit,

3
L'ho usato e ha funzionato per me. Probabilmente dovrebbe essere la risposta eletta. Nota che il "codice" che ottieni localmente sembra essere pesante sui metadati, il che lo rende poco chiaro per i neofiti se qualcosa è andato storto.
nick

3
Questa dovrebbe essere la risposta approvata. Molto meglio di altre soluzioni
Travis Griggs,

15
Ho finito con tutti i rami sul mio nuovo repository remoto refs/heads/refs/headscon prefisso usando git push -f --tags remoteName refs/heads/*:refs/heads/*quindi ho cambiato agit push remoteName --mirror
silente

1
pushsupporta anche --mirror. git clone --mirror; cd repo; git push --mirror new_remotedovrebbe fare il trucco
Knittl

144

Questo ha funzionato perfettamente per me .

git clone --mirror <URL to my OLD repo location>
cd <New directory where your OLD repo was cloned>
git remote set-url origin <URL to my NEW repo location>
git push -f origin

Devo dire però che questo crea un mirror del tuo repository corrente e quindi lo spinge nella nuova posizione. Pertanto, ciò può richiedere del tempo per repository di grandi dimensioni o connessioni lente .


15
*** Questo ***
Paul Lockwood,

1
Questa è la buona soluzione git remote set-url origin <URL alla mia NUOVA posizione repo> (dopo aver sincronizzato la vecchia origine con il nuovo server / posizione)
Toni Homedes i Saun

2
Questo si è svegliato alla grande. Nessun confuso telecomando multiplo
TaoPR,

17
Preferisco git push --mirror originfinita -f.
Aidiakapi,

78

Copialo sopra. È davvero così semplice. :)

Sul lato client, basta modificare .git / config nel repository locale del client per indirizzare i telecomandi al nuovo URL, se necessario.


6
Puoi anche semplicemente clonarlo. Inoltre, invece di modificare direttamente il file .git / config, puoi usare git remote rm origin; git remote add origin <nuovo repository>.
ebneter,

4
rming il telecomando perderà qualsiasi configurazione in quella sezione della configurazione - e clonarlo senza fare ulteriori passi perderà rami diversi dal trunk. È possibile affrontare questi problemi, ma, davvero, basta risincronizzarli.
bdonlan,

1
Qual è la soluzione usando solo git per fare il lavoro? rsync richiede ulteriori cerchi amministrativi che sono difficili da superare
emmby

2
questo preserva anche ad esempio hook e altre configurazioni, quindi lo preferisco a soluzioni git pure
mnagel

66

Questo è fatto in parte in alcune delle altre risposte.

git clone --mirror git@oldserver:oldproject.git
cd oldproject.git
git remote add new git@newserver:newproject.git
git push --mirror new

7
Questa è, in effetti, la risposta più completa e diretta.
Lawrence Dol,

4
--mirrornella spinta è molto importante: questa dovrebbe essere la risposta corretta
PaoloC

Quando si inizializza il nuovo repository sul nuovo server, ricordarsi di eseguire un init nudo o il push non avrà esito positivo:git init --bare
marco,

35

Sto solo ripubblicando quello che altri hanno detto, in un semplice elenco di istruzioni da seguire.

  1. Spostare il repository: è sufficiente accedere al nuovo server, cdalla directory principale in cui si desidera ora conservare il repository e utilizzare rsyncper copiare dal vecchio server:

    new.server> rsync -a -v -e ssh user@old.server.com:path/to/repository.git .
    
  2. Fai in modo che i client puntino al nuovo repository: ora su ogni client che utilizza il repository, basta rimuovere il puntatore alla vecchia origine e aggiungerne uno a quello nuovo.

    client> git remote rm origin
    client> git remote add origin user@new.server.com:path/to/repository.git
    

Semplice ed efficace Puoi aggiungere il flag --bwlimit = XXX se vuoi limitare il traffico tra i server, dove XXX è uguale alla larghezza di banda in KByte al secondo.
Greg Glockner,

7
Un po 'meglio di rimuovere e aggiungere:git remote set-url origin user@new.server.com:path/to/repository.git
Chris KL

Per coloro che distribuiscono su un server usando git + capistrano, nota che ho dovuto usare l'origine set-url in 2 posti: su localhost e sulla copia cache che è sul server.
anandvc,


10

Ho seguito le istruzioni su BitBucket per spostare un repository con tutti i suoi rami lì. Ecco i passaggi con spiegazioni che seguono il #personaggio:

cd path/to/local/repo
git remote remove origin # to get rid of the old setting, this was not in the BitBucket instructions
git remote add origin ssh://git@bitbucket.org/<username>/<newrepo> # modify URL as needed
git push -u origin --all # pushes _ALL_ branches in one go
git push -u origin --tags # pushes _ALL_ tags in one go

Ha funzionato bene per me.


8

Si prega di seguire i passaggi:

  • git remote aggiunge new-origin
  • git push - tutto nuovo
  • git push - tagga nuova origine
  • git remote rm origin
  • git rinominare da remoto l'origine di nuova origine

5

Questa è una variante di questa risposta , attualmente suggerita da gitlab per "migrare" un repository git da un server all'altro.

  1. Supponiamo che il tuo vecchio progetto venga chiamato existing_repo, archiviato in una existing_repocartella.

  2. Crea un repository sul tuo nuovo server. Supponiamo che l'URL di quel nuovo progetto siagit@newserver:newproject.git

  3. Apri un'interfaccia della riga di comando e inserisci quanto segue:

    cd existing_repo
    git remote rename origin old-origin
    git remote add origin git@newserver:newproject.git
    git push -u origin --all
    git push -u origin --tags
    

I vantaggi di questo approccio è che non si elimina il ramo che corrisponde al vecchio server.


4

Puoi usare il seguente comando:

git remote set-url --push origin new_repo_url

Esempio da http://gitref.org/remotes/

$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/github/git-reference.git (fetch)
origin  git://github.com/github/git-reference.git (push)
$ git remote set-url --push origin git://github.com/pjhyett/hw.git
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/github/git-reference.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)

4

Dovrebbe essere semplice come:

git remote set-url origin git://new.url.here

In questo modo conservate il nome originper il vostro nuovo repository, quindi inviate al nuovo repository quello vecchio come indicato nelle altre risposte. Supponendo che tu lavori da solo e che tu abbia un repository locale che vuoi rispecchiare con tutta la tua cruft al suo interno, potresti anche (dall'interno del tuo repository locale)

git push origin --mirror # origin points to your new repo

ma vedi "git push --mirror" è sufficiente per eseguire il backup del mio repository? (in tutto non usare --mirrorma una volta).


3

seguire queste istruzioni Se si desidera mantenere tutti i commit e le filiali dal repository vecchio al nuovo

git clone --bare <old-repo-url>
cd <old-repo-directory>
git push --mirror <new-repo-url>

1

Puoi usare git-copy per duplicare il repository con tutte le cronologie.

git copy http://a.com/old.git http://a.com/new.git

1

Se si desidera passare da un'origine all'altra e mantenere anche un backup dell'origine corrente sul computer locale, è possibile utilizzare questi passaggi:

  1. Prima vai localmente nella cartella (git) su cui vuoi spostarti
  2. Crea il nuovo repository online Questo passaggio crea un repository in cui è possibile inviare il codice

Ora nella cartella fai

git remote get-url origin

Il comando precedente fornisce l'URL di origine remoto corrente, utile per riportare l'origine nell'ultimo passaggio

git remote set-url origin git@github.newlocation:folder/newrepo.git

Il comando sopra imposta l'origine remota nella nuova posizione

git push --set-upstream origin develop

Il comando sopra invia il ramo locale attivo corrente al remoto con sviluppo nome ramo. Ovviamente conserva tutta la storia poiché con git viene spinta anche tutta la storia.

git remote set-url origin <original old origin>

Il comando sopra riporta l'origine remota alla tua origine corrente: lo vuoi perché sei nella cartella esistente e probabilmente non vuoi mescolare il nome della cartella locale corrente con la nuova cartella che creerai per clonare il repository hai appena spinto.

Spero che questo ti aiuti,


0

Se vuoi migrare un repository #git da un server a uno nuovo puoi farlo in questo modo:

git clone OLD_REPOSITORY_PATH
cd OLD_REPOSITORY_DIR
git remote add NEW_REPOSITORY_ALIAS  NEW_REPOSITORY_PATH
#check out all remote branches 
for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done
git push --mirror NEW_REPOSITORY_PATH
git push NEW_REPOSITORY_ALIAS --tags

Tutti i rami remoti e i tag dal vecchio repository verranno copiati nel nuovo repository.

Eseguendo questo comando da solo:

git push NEW_REPOSITORY_ALIAS

copierebbe solo un ramo principale (solo rami di tracciamento) nel nuovo repository.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.