Cómo migrar el repositorio GIT de un servidor a uno nuevo

264

Tengo un servidor que estoy quitando. Lo único que me queda por migrar es mi repositorio. Este servidor aparece como el origen (maestro) de uno de mis proyectos. ¿Cuál es la forma correcta de mover el repositorio para mantener el historial?

cjibo
fuente
Toda la información (origen, troncal, etc.) sobre el repositorio se almacena en una carpeta llamada '.git', donde está inicializando el repositorio. Por lo tanto, debe copiar el contenido al nuevo servidor, siguiendo las instrucciones proporcionadas aquí.
Mansab Uppal
1
simplemente git config remote.origin.url newurl ver stackoverflow.com/questions/3011402/…
Niels
1
Si desea migrar su repositorio y todas las sucursales, use la respuesta de jzwiener o Roberto en lugar de la respuesta aceptada.
jonaglon

Respuestas:

247

Para agregar la nueva ubicación del repositorio,

git remote add new_repo_name new_repo_url

Luego empuje el contenido a la nueva ubicación

git push new_repo_name master

Finalmente quita el viejo

git remote rm origin

Después de eso, puede hacer lo que dijo bdonlan y editar el archivo git / config para cambiar el nuevo nombre_poder a origen. Si no elimina el origen (repositorio remoto original), simplemente puede empujar los cambios al nuevo repositorio con

git push new_repo_name master
Koby
fuente
8
¿Copiaría esto solo una rama del repositorio antiguo al nuevo?
Andrew Grimm
34
¿Cuál es la solución para migrar todas las sucursales?
emmby
50
Debería poder empujar todas las ramas a la vez a través de git push -u new_repo_name --all.
rmarscher
10
La migración de todas las ramas se puede encontrar en stackoverflow.com/a/18336145/923599
jzwiener
10
En lugar de editar el archivo git-config, este comando funcionó para mí:git remote rename new_repo_name origin
Salim
210

Si desea migrar todas las ramas y etiquetas, debe usar los siguientes comandos:

git clone --mirror [oldUrl]

para clonar el antiguo repositorio con todas las ramas

cd the_repo
git remote add remoteName newRepoUrl

configurar un nuevo control remoto

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

para empujar todas las referencias bajo referencias / cabezas (que es probablemente lo que quieres)

jzwiener
fuente
55
Git se quejaba de eso --tagsy refs/heads/*:refs/heads/*no es compatible con él --mirror. stackoverflow.com/a/26552740/1484831 funcionó bien.
Avigit
3
Usé esto y funcionó para mí. Probablemente debería ser la respuesta elegida. Tenga en cuenta que el "código" que obtiene localmente parece ser pesado en los metadatos, lo que deja en claro a los novatos si algo salió mal.
nick
3
Esta debería ser la respuesta aprobada. Mucho mejor que otras soluciones
Travis Griggs
15
Terminé con todas las ramas en mi nuevo repositorio remoto prefijado refs/heads/refs/headsutilizando git push -f --tags remoteName refs/heads/*:refs/heads/*así que he cambiado agit push remoteName --mirror
dumbledad
1
pushTambién apoya --mirror. git clone --mirror; cd repo; git push --mirror new_remotedebería hacer el truco
knittl
144

Esto funcionó para mí sin problemas .

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

Sin embargo, debo mencionar que esto crea un espejo de su repositorio actual y luego lo empuja a la nueva ubicación. Por lo tanto, esto puede tomar algún tiempo para repositorios grandes o conexiones lentas .

Roberto
fuente
15
*** Este ***
Paul Lockwood
1
Esta es la buena solución git remote set-url origin <URL to my NEW repo location> (después de haber sincronizado el origen antiguo al nuevo servidor / ubicación)
Toni Homedes i Saun
2
Este funciona genial. Sin controles remotos múltiples confusos
TaoPR
17
Prefiero git push --mirror originsobre -f.
Aidiakapi
78

Cópialo de nuevo. Es realmente así de simple. :)

En el lado del cliente, solo edite .git / config en el repositorio local del cliente para apuntar sus controles remotos a la nueva URL según sea necesario.

bdonlan
fuente
66
También puedes simplemente clonarlo. Además, en lugar de editar directamente el archivo .git / config, puede usar git remote rm origin; git remote add origin <nuevo repositorio>.
ebneter
44
Al encender el control remoto se perderá cualquier configuración en esa sección de la configuración, y clonarlo sin tomar ningún paso adicional perderá otras ramas además del tronco. Es posible lidiar con estos problemas, pero, en realidad, solo sincronícelo.
bdonlan
1
¿Cuál es la solución usando solo git para hacer el trabajo? rsync requiere aros administrativos adicionales que son difíciles de atravesar
emmby
2
esto también conserva, por ejemplo, ganchos y otras configuraciones, así que lo prefiero a las soluciones de git puro
mnagel
66

Esto se hace en partes en algunas de las otras respuestas.

git clone --mirror git@oldserver:oldproject.git
cd oldproject.git
git remote add new git@newserver:newproject.git
git push --mirror new
Ian Walters
fuente
77
Esta es, de hecho, la respuesta más completa y directa.
Lawrence Dol
44
--mirroren el empuje es muy importante: esta debería ser la respuesta correcta
PaoloC
Cuando inicialice el nuevo repositorio en el nuevo servidor, recuerde hacer un simple inicio o la inserción no tendrá éxito:git init --bare
marco
35

Solo vuelvo a publicar lo que otros han dicho, en una lista de instrucciones simple de seguir.

  1. Mueva el repositorio: simplemente inicie sesión en el nuevo servidor, cden el directorio principal donde ahora desea mantener el repositorio, y use rsyncpara copiar desde el servidor anterior:

    new.server> rsync -a -v -e ssh [email protected]:path/to/repository.git .
    
  2. Hacer que los clientes apunten al nuevo repositorio: ahora, en cada cliente que use el repositorio, simplemente quite el puntero al origen anterior y agregue uno al nuevo.

    client> git remote rm origin
    client> git remote add origin [email protected]:path/to/repository.git
    
Juan A. Navarro
fuente
Simple y efectivo. Puede agregar el indicador --bwlimit = XXX si desea limitar el tráfico entre los servidores, donde XXX equivale al ancho de banda en KBytes por segundo.
Greg Glockner el
77
Un poco mejor que eliminar y agregar:git remote set-url origin [email protected]:path/to/repository.git
Chris KL
Para aquellos que implementan en un servidor usando git + capistrano, tenga en cuenta que tuve que usar set-url origin en 2 lugares: en localhost y en la copia en caché que está en el servidor.
anandvc
10

Seguí las instrucciones en BitBucket para mover un repositorio con todas sus ramas allí. Aquí vienen los pasos con explicaciones que siguen al #personaje:

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://[email protected]/<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

Funcionó muy bien para mí.

Laryx Decidua
fuente
8

Por favor siga los pasos:

  • git remote add new-origin
  • git push: todo nuevo origen
  • git push --tags new-origin
  • origen rm remoto git
  • git cambio de nombre remoto origen de nuevo origen
Boush
fuente
5

Esta es una variación de esta respuesta , actualmente sugerida por gitlab para "migrar" un repositorio git de un servidor a otro.

  1. Supongamos que se llama a su antiguo proyecto existing_repo, almacenado en una existing_repocarpeta.

  2. Crea un repositorio en tu nuevo servidor. Asumiremos que la url de ese nuevo proyecto esgit@newserver:newproject.git

  3. Abra una interfaz de línea de comandos e ingrese lo siguiente:

    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
    

Los beneficios de este enfoque es que no elimina la rama que corresponde a su antiguo servidor.

Clemente
fuente
4

Puede usar el siguiente comando:

git remote set-url --push origin new_repo_url

Ejemplo de http://gitref.org/remotes/

$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]: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  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)
origin  git://github.com/github/git-reference.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)
mrroboaat
fuente
4

Debería ser tan simple como:

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

De esta manera, mantienes el nombre originde tu nuevo repositorio, luego empujas al nuevo repositorio, el antiguo como se detalla en las otras respuestas. Supongamos que trabaja solo y tiene un repositorio local que desea reflejar con todo su contenido en él, también podría hacerlo (desde dentro de su repositorio local)

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

pero vea ¿Es "git push --mirror" suficiente para hacer una copia de seguridad de mi repositorio? (en general, no use, --mirrorpero una vez).

Mr_and_Mrs_D
fuente
3

siga estas instrucciones si desea mantener todos los commits y ramas del repositorio antiguo al nuevo

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

Puede usar git-copy para duplicar el repositorio con todas las historias.

git copy http://a.com/old.git http://a.com/new.git
Quanlong
fuente
1

Si desea pasar de un origen a otro y también mantener una copia de seguridad de su origen actual en su máquina local, puede seguir estos pasos:

  1. Primero vaya localmente a la carpeta (git) sobre la que desea moverse
  2. Crear el nuevo repositorio en línea Este paso crea un repositorio donde podemos insertar código para

Ahora en la carpeta hacer

git remote get-url origin

El comando anterior proporciona la URL de origen remota actual, útil para volver a establecer el origen en el último paso

git remote set-url origin [email protected]:folder/newrepo.git

El comando anterior establece el origen remoto en la nueva ubicación

git push --set-upstream origin develop

El comando anterior empuja la rama local activa actual a remota con el desarrollo de nombre de rama. Por supuesto, conserva toda la historia, ya que con git también se empuja toda la historia.

git remote set-url origin <original old origin>

El comando anterior restablece el origen remoto a su origen actual: desea esto porque está en su carpeta existente y probablemente no desee mezclar el nombre de su carpeta local actual con la nueva carpeta que va a crear para clonar el repositorio acabas de empujar.

Espero que esto ayude,

Hace
fuente
0

Si desea migrar un repositorio #git de un servidor a uno nuevo, puede hacerlo así:

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

Todas las ramas y etiquetas remotas del antiguo repositorio se copiarán en el nuevo repositorio.

Ejecutando este comando solo:

git push NEW_REPOSITORY_ALIAS

solo copiaría una rama maestra (solo ramas de seguimiento) al nuevo repositorio.

maestr0
fuente