Saltar al contenido

¿Cómo importar un repositorio Git existente a otro?

Tenemos el hallazgo a esta contrariedad, o por lo menos eso esperamos. Si continuas con alguna inquietud compártelo en un comentario, que con gusto te ayudaremos

Solución:

Probablemente la forma más sencilla sería tirar de la XXX cosas en una rama en AAAA y luego fusionarlo en maestro:

En AAAA:

git remote add other /path/to/XXX
git fetch other
git checkout -b ZZZ other/master
mkdir ZZZ
git mv stuff ZZZ/stuff                      # repeat as necessary for each file/dir
git commit -m "Moved stuff to ZZZ"
git checkout master                
git merge ZZZ --allow-unrelated-histories   # should add ZZZ/ to master
git commit
git remote rm other
git branch -d ZZZ                           # to get rid of the extra branch before pushing
git push                                    # if you have a remote, that is

De hecho, acabo de probar esto con un par de mis repositorios y funciona. A diferencia de la respuesta de Jörg, no le permitirá continuar usando el otro repositorio, pero no creo que lo haya especificado de todos modos.

Nota: Dado que esto se escribió originalmente en 2009, git agregó la combinación de subárboles mencionada en la respuesta a continuación. Probablemente usaría ese método hoy, aunque, por supuesto, este método todavía funciona.

Si desea conservar el historial de confirmación exacto del segundo repositorio y, por lo tanto, también conservar la capacidad de fusionar fácilmente los cambios anteriores en el futuro, este es el método que desea. Da como resultado un historial sin modificar del subárbol que se importa a su repositorio más una confirmación de combinación para mover el repositorio combinado al subdirectorio.

git remote add XXX_remote 
git fetch XXX_remote
git merge -s ours --no-commit --allow-unrelated-histories XXX_remote/master
git read-tree --prefix=ZZZ/ -u XXX_remote/master
git commit -m "Imported XXX as a subtree."

Puede realizar un seguimiento de los cambios ascendentes de esta manera:

git pull -s subtree XXX_remote master

Git descubre por sí mismo dónde están las raíces antes de realizar la fusión, por lo que no necesita especificar el prefix en fusiones posteriores.

los Abajo es que en el historial fusionado los archivos no tienen prefijo (no en un subdirectorio). Como resultado git log ZZZ/a le mostrará todos los cambios (si los hay) excepto los del historial fusionado. Tu puedes hacer:

git log --follow -- a

pero eso no mostrará los cambios que no sean en el historial combinado.

En otras palabras, si no cambias ZZZarchivos de en el repositorio XXXentonces necesitas especificar --follow y un camino sin prefijo. Si los cambia en ambos repositorios, entonces tiene 2 comandos, ninguno de los cuales muestra todos los cambios.

Versiones de Git anteriores a la 2.9: No es necesario pasar el --allow-unrelated-histories opción a git merge.

El método en la otra respuesta que usa read-tree y se salta el merge -s ours El paso no es diferente de copiar los archivos con cp y confirmar el resultado.

La fuente original fue del artículo de ayuda “Subtree Merge” de github. Y otro enlace útil.

git-subtree es un script diseñado exactamente para este caso de uso de fusionar múltiples repositorios en uno mientras se preserva el historial (y/o se divide el historial de los subárboles, aunque eso parece ser irrelevante para esta pregunta). Se distribuye como parte del árbol git desde la versión 1.7.11.

Para fusionar un repositorio en revisión como subdirectorio

, use git subtree add as follows:

git subtree add -P   

git-subtree implementa la estrategia de combinación de subárboles de una manera más fácil de usar.

Para su caso, dentro del repositorio YYY, ejecutaría:

git subtree add -P ZZZ /path/to/XXX.git master

los Abajo es que en el historial fusionado los archivos no tienen prefijo (no en un subdirectorio). Como resultado git log ZZZ/a le mostrará todos los cambios (si los hay) excepto los del historial fusionado. Tu puedes hacer:

git log --follow -- a

pero eso no mostrará los cambios que no sean en el historial combinado.

En otras palabras, si no cambias ZZZarchivos de en el repositorio XXXentonces necesitas especificar --follow y un camino sin prefijo. Si los cambia en ambos repositorios, entonces tiene 2 comandos, ninguno de los cuales muestra todos los cambios.

Más sobre esto aquí.

Recuerda mostrar esta crónica si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 3.5)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *