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

Resuelto Vijay Patel asked hace 15 años • 17 respuestas

Tengo un repositorio Git en una carpeta llamada XXX y tengo un segundo repositorio Git llamado YYY .

Quiero importar el repositorio XXX al repositorio YYY como un subdirectorio llamado ZZZ y agregar todo el historial de cambios de XXX a YYY .

Estructura de carpetas antes:

├── XXX
│   ├── .git
│   └── (project files)
└── YYY
    ├── .git
    └── (project files)

Estructura de carpetas después de:

YYY
├── .git  <-- This now contains the change history from XXX
├──  ZZZ  <-- This was originally XXX
│    └── (project files)
└──  (project files)

¿Se puede hacer esto o debo recurrir al uso de submódulos?

Vijay Patel avatar Nov 06 '09 03:11 Vijay Patel
Aceptado

Probablemente la forma más sencilla sería colocar el material XXX en una rama en YYY y luego fusionarlo en master:

En AAA :

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, probé 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árbol mencionada en la respuesta a continuación. Probablemente usaría ese método hoy en día, aunque, por supuesto, todavía funciona.

ebneter avatar Nov 06 '2009 00:11 ebneter

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 ascendentes en el futuro, este es el método que desea. Esto da como resultado un historial no modificado del subárbol que se importa a su repositorio más una confirmación de fusión para mover el repositorio fusionado al subdirectorio.

git remote add XXX_remote <path-or-url-to-XXX-repo>
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í solo dónde están las raíces antes de realizar la fusión, por lo que no es necesario especificar el prefijo en fusiones posteriores.

La desventaja es que en el historial combinado los archivos no tienen prefijo (no están en un subdirectorio). Como resultado, git log ZZZ/ase le mostrarán todos los cambios (si los hay), excepto aquellos en el historial combinado. Tu puedes hacer:

git log --follow -- a

pero eso no mostrará los cambios más allá del historial fusionado.

En otras palabras, si no cambia ZZZlos archivos en el repositorio XXX, entonces deberá especificar --followuna ruta sin prefijo. Si los cambia en ambos repositorios, entonces tendrá 2 comandos, ninguno de los cuales muestra todos los cambios.

Versiones de Git anteriores a la 2.9 : no es necesario pasar la --allow-unrelated-historiesopción a git merge.

El método en la otra respuesta que usa read-treey omite el merge -s ourspaso no es diferente a copiar los archivos con cp y confirmar el resultado.

La fuente original fue el artículo de ayuda "Subtree Merge" de github . Y otro enlace útil .

ColinM avatar Dec 06 '2011 06:12 ColinM

git-subtreees un script diseñado exactamente para este caso de uso de fusionar múltiples repositorios en uno mientras se preserva el historial (y/o divide el historial de 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 <repo>en revisión <rev>como subdirectorio <prefix>, utilice git subtree addlo siguiente:

git subtree add -P <prefix> <repo> <rev>

git-subtree implementa la estrategia de fusió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

La desventaja es que en el historial combinado los archivos no tienen prefijo (no están en un subdirectorio). Como resultado, git log ZZZ/ase le mostrarán todos los cambios (si los hay), excepto aquellos en el historial combinado. Tu puedes hacer:

git log --follow -- a

pero eso no mostrará los cambios más allá del historial fusionado.

En otras palabras, si no cambia ZZZlos archivos en el repositorio XXX, entonces deberá especificar --followuna ruta sin prefijo. Si los cambia en ambos repositorios, entonces tendrá 2 comandos, ninguno de los cuales muestra todos los cambios.

Más sobre esto aquí .

kynan avatar Sep 20 '2015 21:09 kynan