Mover contenido del repositorio de Git a otro repositorio conservando el historial


141

Estoy tratando de mover solo el contenido de un repositorio ( repo1) a otro repositorio existente ( repo2) usando los siguientes comandos:

git clone repo1
git clone repo2
cd repo1
git remote rm origin
git remote add repo1
git push

Pero no está funcionando. Revisé una publicación similar, pero solo encontré una que movía la carpeta, no el contenido.


¿Desea tener el contenido de repo1 como una rama en repo2, o como parte de master, para que las carpetas de ambos repos coexistan en su directorio de trabajo?
Crónica

Quiero moverlo como parte del maestro.
Mario

44
Este tutorial es perfecto! smashingmagazine.com/2014/05/19/…
xpto

Respuestas:


242

Creo que los comandos que estás buscando son:

cd repo2
git checkout master
git remote add r1remote **url-of-repo1**
git fetch r1remote
git merge r1remote/master --allow-unrelated-histories
git remote rm r1remote

Después de eso repo2/mastercontendrá todo de repo2/mastery repo1/master, y también tendrá la historia de ambos.


Gracias Chronial, solo quiero asegurarme de que el repo1 también tenga una rama y ¿qué pasa si quiero mover esa rama también a repo2?
Mario

bueno, ¿repo2 también tiene una segunda rama? ¿O qué debería pasar con esa rama?
Crónica

1
¡Crónico, los comandantes anteriores no funcionaron! no copió la historia.
Mario

1
OK, ahora funcionó. Usé el siguiente comando; cd repo2,> git remote rm origin> git remote add origin url-of-repo1 ,> git fetch r1remote> git push origin master
Mario

1
@abhijithda La solución más simple sería mover todo dentro de repo1una subcarpeta (dentro repo1) antes de hacer la fusión.
Crónica

55

Perfectamente descrito aquí https://www.smashingmagazine.com/2014/05/moving-git-repository-new-server/

Primero, tenemos que buscar todas las ramas y etiquetas remotas del repositorio existente en nuestro índice local:

git fetch origin

Podemos verificar cualquier rama faltante que necesitemos para crear una copia local de:

git branch -a

Usemos la URL SSH-clonada de nuestro nuevo repositorio para crear un nuevo control remoto en nuestro repositorio local existente:

git remote add new-origin git@github.com:manakor/manascope.git

Ahora estamos listos para enviar todas las ramas y etiquetas locales al nuevo control remoto llamado new-origin:

git push --all new-origin 
git push --tags new-origin

Hagamos de nuevo origen el control remoto predeterminado:

git remote rm origin

Cambie el nombre de nuevo origen a solo origen, para que se convierta en el control remoto predeterminado:

git remote rename new-origin origin

44
Puede confirmar que esto copia todo el historial y las etiquetas. Muy agradable. Gracias.
Alex

Si el nuevo origen no tiene ninguna confirmación, funciona bien. Sin embargo, si hay alguna confirmación en el nuevo origen, la forma mencionada aquí no será la esperada.
Caot

es necesario cambiar git checkout BranchNamelas sucursales con y luego empujar la rama al repositorio remoto nuevamente, git push --all new-origin pero muchas gracias
Raad Altaie

21

Si está buscando preservar las ramas existentes y confirmar el historial, esta es una forma que me funcionó.

git clone --mirror https://github.com/account/repo.git cloned-repo
cd cloned-repo
git push --mirror {URL of new (empty) repo}

# at this point only remote cloned-repo is correct, local has auto-generated repo structure with folders such as "branches" or "refs"
cd ..
rm -rf cloned-repo
git clone {URL of new (empty) repo}
# only now will you see the expected user-generated contents in local cloned-repo folder

# note: all non-master branches are avaialable, but git branch will not show them until you git checkout each of them
# to automatically checkout all remote branches use this loop:
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

Ahora, suponga que desea mantener sincronizados los repositorios de origen y destino durante un período de tiempo. Por ejemplo, todavía hay actividad dentro del repositorio remoto actual que desea llevar al repositorio nuevo / de reemplazo.

git clone -o old https://github.com/account/repo.git my-repo
cd my-repo
git remote add new {URL of new repo}

Para desplegar las últimas actualizaciones (suponiendo que no tenga cambios locales):

git checkout {branch(es) of interest}
git pull old
git push --all new

NB: todavía tengo que usar submódulos, así que no sé qué pasos adicionales podrían ser necesarios si los tiene.


1
Esto funcionó simple y fácilmente para mí. Creo que debería ser la respuesta marcada. Si tiene 60 sucursales, este es el camino a seguir.
rickfoosusa

7

Enfoque más simple si Git ya rastrea el código y luego establece un nuevo repositorio como tu "origen" al que presionar.

cd existing-project
git remote set-url origin https://clone-url.git
git push -u origin --all
git push origin --tags

6

Esto funcionó para mover mi repositorio local (incluido el historial) a mi repositorio remoto github.com. Después de crear el nuevo repositorio vacío en GitHub.com, uso la URL en el paso tres a continuación y funciona muy bien.

git clone --mirror <url_of_old_repo>
cd <name_of_old_repo>
git remote add new-origin <url_of_new_repo>
git push new-origin --mirror

Encontré esto en: https://gist.github.com/niksumeiko/8972566


1
Esta es la forma más fácil de dejar el repositorio original. También copia todas las ramas.
Guillermo

1
Esto también copia todas las etiquetas.
cuervo

2

Utilicé el siguiente método para migrar mi GIT Stash a GitLab manteniendo todas las ramas y el historial de confirmación.

Clonar el antiguo repositorio a local.

git clone --bare <STASH-URL>

Crea un repositorio vacío en GitLab.

git push --mirror <GitLab-URL>

1

Parece que estás cerca. Suponiendo que no es solo un error tipográfico en su envío, el paso 3 debería ser en cd repo2lugar de repo1. Y el paso 6 no debe ser git pullempujar. Lista reelaborada:

1. git clone repo1
2. git clone repo2
3. cd repo2
4. git remote rm origin
5. git remote add repo1
6. git pull
7. git remote rm repo1
8. git remote add newremote

Gracias Eric, pero en el paso 3 quiero eliminar el enlace del repositorio original para evitar hacer cambios remotos ... ya que quiero mover el contenido de repo1 a repo2.
Mario

Bien. He editado mi respuesta para tratar de reflejar eso. Solo para asegurarse, ¿está tratando de hacer un repositorio, repo2, que sea una copia de repo1 pero que no mantenga ni repo1 ni origen como controles remotos?
Eric Palace

No, no estoy tratando de hacer un nuevo repositorio "repo2". En realidad, tengo un repo2 existente que tiene otros contenidos init. Ahora quiero mover todo el contenido de repo1 a repo2 con el historial. Mantendré el repositorio vacío como está en el servidor.
Mario

¿Has considerado no usar git? Parece que probablemente podría copiar los archivos (a través de una interfaz gráfica de usuario o scp o ftp) y agregarlos manualmente a su repositorio de git. Puede que no sea tan eficiente, pero es probable que sea más simple.
Eric Palace

Ya lo intenté pero dejó la historia. Quiero mover toda su historia también.
Mario

1

Según la respuesta de @ Dan-Cohn, Mirror-push es tu amigo aquí. Esta es mi opción para migrar repositorios:

Reflejando un repositorio

1.Abra Git Bash.

2.Cree un clon desnudo del repositorio.

$ git clone --bare https://github.com/exampleuser/old-repository.git

3.Mirror-push al nuevo repositorio.

$ cd old-repository.git
$ git push --mirror https://github.com/exampleuser/new-repository.git

4. Retire el repositorio local temporal que creó en el paso 1.

$ cd ..
$ rm -rf old-repository.git

Referencia y crédito: https://help.github.com/en/articles/duplicating-a-repository


-1

Aquí hay muchas respuestas complicadas; sin embargo, si no le preocupa la preservación de la rama, todo lo que necesita hacer es restablecer el origen remoto, configurar el flujo ascendente y presionar.

Esto funcionó para preservar todo el historial de confirmaciones para mí.

cd <location of local repo.>
git remote set-url origin <url>
git push -u origin master
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.