Me gustaría fusionar un repositorio git remoto en mi repositorio git activo como subdirectorio de él. Me gustaría que el repositorio resultante contenga el historial fusionado de los dos repositorios y también que cada archivo del repositorio fusionado conserve su historial tal como estaba en el repositorio remoto. Intenté usar la estrategia del subárbol como se menciona en How to use the subtree merge strategy, pero después de seguir ese procedimiento, aunque el repositorio resultante contiene de hecho el historial fusionado de los dos repositorios, los archivos individuales que provienen del remoto no han conservado su historial (`git log 'en cualquiera de ellos solo muestra un mensaje "Sucursal fusionada ...").Merge repositorio de git en el subdirectorio
Tampoco quiero usar submódulos porque no quiero que los dos repositorios de git combinados estén separados.
¿Es posible fusionar un repositorio git remoto en otro como un subdirectorio con archivos individuales procedentes del repositorio remoto que conserva su historial?
Muchas gracias por cualquier ayuda.
EDIT: Actualmente estoy probando una solución que usa git filter-branch para reescribir el historial del repositorio fusionado. Parece que funciona, pero necesito probarlo un poco más. Volveré para informar sobre mis hallazgos.
EDIT 2: Espero ser más claro. Doy los comandos exactos que utilicé con la estrategia de subárbol de git, que dan como resultado una aparente pérdida de historial de los archivos del repositorio remoto. Deje que A sea el repositorio git en el que estoy trabajando actualmente y B el repositorio git que me gustaría incorporar a A como subdirectorio de él. Se hizo lo siguiente:
git remote add -f B <url-of-B>
git merge -s ours --no-commit B/master
git read-tree --prefix=subdir/Iwant/to/put/B/in/ -u B/master
git commit -m "Merge B as subdirectory in subdir/Iwant/to/put/B/in."
Después de estos comandos y entrar en el directorio subdirectorio/Iwant/a/poner/B/en, veo todos los archivos de B, pero git log
en cualquiera de ellos muestra sólo el mensaje de confirmación "Fusionar B como subdirectorio en subdir/Iwant/to/put/B/in". Su historial de archivos como está en B se pierde.
Lo que parece para trabajar (ya que soy un principiante en git puedo estar equivocado) es la siguiente:
git remote add -f B <url-of-B>
git checkout -b B_branch B/master # make a local branch following B's master
git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&subdir/Iwant/to/put/B/in/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
git checkout master
git merge B_branch
El comando anterior para el filtro se toma la rama del git help filter-branch
, en el que yo solo cambió la ruta del subdirectorio.
¿Qué dice 'gitk' sobre la historia? He usado la fusión de subárbol git con éxito en el pasado. ¿Quizás puedas revelar tus comandos exactos? No estoy seguro de que git-filter-branch sea el enfoque correcto. Podría recomendar probar git-fast-export y git-fast-import para sintetizar un nuevo historial. –
Después de hacer el procedimiento del subárbol 'gitk' muestra los dos repos combinados en sus consejos y no relacionados en sus confirmaciones iniciales. (¿Ayudaría si publico capturas de pantalla de la vista de historial de gitk? ¿Puedo?) Lamentablemente, los archivos individuales del repositorio remoto no han conservado su historial si lo hago en el terminal 'git log'. Miro en 'git-fast-export' y' git-fast-import'; Soy muy nuevo en git. Editaré mi pregunta para mostrar exactamente qué comandos usé con el subárbol de git. Muchas gracias por tu respuesta. –
christosc
@christosc: su segundo método funcionó de manera hermosa y muy simple, ¡muchas gracias! Solo tuve que cambiar subdir/Iwant/to/put/B/in/y hacerlo un oneliner (porque msysgit en Windows parece no admitir retornos de línea en comandos con \): git filter-branch --index- filtrar 'git ls-files -s | sed "s- \ t \" * - & subdir/Iwant/to/put/B/in/- "| GIT_INDEX_FILE = $ GIT_INDEX_FILE.nuevo git update-index --index-info && mv" $ GIT_INDEX_FILE.new "" $ GIT_INDEX_FILE "'HEAD – gaborous