Fusionar después de que el directorio se convirtió en submódulo
Me parece que al trabajar con submódulos git, a menudo encuentro problemas al fusionar entre commits que contienen un submódulo dado y aquellos que representan el mismo código que un directorio normal. Pequeño ejemplo de reproducción:
# Create one project, to be used as a subproject later on
git init a
cd a
echo aaa > aa
git add -A
git commit -m a1
cd ..
# Create a second project, containing a as a normal directory initially
git init b
cd b
mkdir a b
echo aaa > a/aa
echo bbb > b/bb
git add -A
git commit -m b1
# Replace directory with submodule
git rm -r a
git submodule add ../a a
git commit -m b2
# Try to create branch from the pre-submodule state of affairs
git checkout -b branch HEAD^
Esto ya da un error:
error: The following untracked working tree files would be overwritten by checkout:
a/aa
Please move or remove them before you can switch branches.
Aborting
Para evitar el error, primero desinicializo todos los submódulos:
# Create feature brach starting at version without submodule
git submodule deinit .
git checkout -b branch HEAD^
echo abc > b/bb
git commit -a -m b3
Como puede ver, la rama de características no tiene relación alguna con el submódulo, modificando un conjunto diferente de archivos. Lo que hace que todo este problema sea particularmente molesto.
# Try to merge the feature branch
git checkout master
git merge branch
Esto falla nuevamente, con un mensaje de error que no entiendo completamente:
CONFLICT (file/directory): There is a directory with name a in branch. Adding a as a~HEAD
Automatic merge failed; fix conflicts and then commit the result.
Me sale el mismo error si hago ungit submodule update --init
antes degit merge branch
. No veo ningunoa~HEAD
en cualquier lugar, ni en mi árbol de directorios ni en la salida degit status
, que dice así:
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Changes to be committed:
modified: b/bb
Unmerged paths:
(use "git add <file>..." to mark resolution)
added by us: a
Si lo hagogit add a
como se sugiere, recibo otro error:
error: unable to index file a
fatal: updating files failed
Si lo hagogit submodules update --init
justo antes de la fusión, entonces puedo hacergit add a
exitosamente. Pero si olvido hacerlo, y luego trato de hacerlo después de la fusión, recibo este mensaje de error:
Submodule 'a' (…/a) registered for path 'a'
Skipping unmerged submodule a
¿Cómo me recupero de esta situación? Algo diferente agit merge --abort
, ya que me gustaría usarlo para cosas comogit rebase
también, y dado que en algunos escenarios (no sé cómo reproducir), ni siquiera pude abortar la fusión limpiamente, y tuve que hacer un restablecimiento completo.
¿Cómo puedo evitarlo en primer lugar? ¿Existe alguna configuración mágica que haga que git haga lo correcto con submódulos frente a directorios durante las fusiones, de modo que no tenga que procesar manualmente una fusión que solo modifica archivos no relacionados con los submódulos?