¿Puedo mover el directorio .git para un repositorio a su directorio padre?
-
03-07-2019 - |
Pregunta
Tengo dos subdirectorios cada uno con un repositorio, por lo tanto:
PPP/
|--ABC/
| |--.git/
| |--AAA/
| | BBB/
| | CCC/
|
|--DEF/
| |--.git/
| |--DDD/
| |--EEE/
Y me gustaría combinarlos en un repositorio, por lo tanto, asumiría que la estructura del directorio sería así:
PPP/
|--.git/
|--ABC/
| |--AAA/
| |--BBB/
| |--CCC/
|
|--DEF/
| |--DDD/
| |--EEE/
¿Es esto posible?
También actualmente varias personas tienen repositorios en sus máquinas. ¿Cuánto más complicado hace eso la vida?
Ta.
Solución
Puedes hacer lo que estás describiendo así:
-
Mueva el contenido de
ABC
a un subdirectorioABC /
y corrija el historial para que parezca que siempre ha estado allí:$ cd /path/to/ABC $ git filter-branch --index-filter \ 'git ls-files -s | sed "s-\t-&ABC/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ git update-index --index-info && mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD
Ahora su estructura de directorio es
ABC/ABC/your_code
-
Lo mismo para el contenido de
DEF
:$ cd /path/to/DEF $ git filter-branch --index-filter \ 'git ls-files -s | sed "s-\t-&DEF/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ git update-index --index-info && mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD
Ahora su estructura de directorio es
DEF/DEF/your_code
-
Finalmente, cree el repositorio
PPP
y coloqueABC
yDEF
en él:$ mkdir /path/to/PPP $ cd /path/to/PPP $ git init $ git pull /path/to/ABC $ git pull /path/to/DEF
Ahora tiene
PPP / ABC / your_code
yPPP / DEF / your_code
, junto con todo el historial.
Probablemente debería pedirles a sus colegas que ejecuten los comandos anteriores en su sistema, para que todos estén sincronizados.
Nota: los comandos funky
filter-branch
proviene de la página de manual . :-)
Otros consejos
¿Realmente necesita fusionar los dos repositorios existentes en un solo repositorio, o simplemente desea agruparlos?
Si solo quiere agruparlos, entonces git-submodule hará lo que quiera: terminará con tres repositorios donde el nivel superior se vincula con los dos actuales.
Como guía:
-
Debe fusionarlos en un único repositorio si va a aumentar el acoplamiento entre ellos para que ya no tenga sentido usar una versión del repo A con una versión diferente del repo B.
-
Debería usar submódulos si permanecen algo separados (a veces tiene sentido trabajar en uno de forma aislada), pero desea la conveniencia de poder trabajar con ellos juntos (por ejemplo, descargue ambos a la vez, punto de control estados bien conocidos en ambos, etc.).
El uso de submódulos evitará problemas con las copias existentes de los repositorios, ya que el historial no cambia. Fusionarlos creará una nueva historia y será más difícil para las personas que trabajan desde las sucursales existentes fusionar sus cambios.
Para mí, parece difícil hacer lo que quieres porque el historial de ambos proyectos no se fusionará.
Mi mejor consejo sería crear un nuevo repositorio para contener ABC y DEF, manteniendo el antiguo repositorio de estos dos para tener una copia de respaldo del historial y comenzar un nuevo historial con este nuevo proyecto.