Mover una copy de trabajo de Git que contiene submodules

Un cambio reciente en Git cambió la forma en que se maneja el directory .git cuando se usan submodules. En lugar de tener un .git por submodule, todo está ahora en el directory .git "raíz" (el que corresponde a la copy de trabajo incluyendo los submodules).

Luego, en cada submodule, se crea un file que apunta a la nueva location del directory .git .

En mi proyecto , tengo el siguiente file .gitmodules :

 [submodule "tests/shanetworking-tests"] path = tests/shanetworking-tests url = git://github.com/roboptim/roboptim-shanetworking-tests.git [submodule "cmake"] path = cmake url = git://github.com/jrl-umi3218/jrl-cmakemodules.git 

Cuando hago git clone --recursive , entonces git clone --recursive :

 $ cat cmake/.git gitdir: /home/moulard/profiles/default-x86_64-linux-ubuntu-12.04.1/src/unstable/roboptim/roboptim-core/.git/modules/cmake 

Actualmente estoy usando Git 1.8.1.5.

Mis preguntas son:

  1. ¿Por qué cambió este comportamiento? No veo ningún beneficio obvio para esta nueva estrategia.
  2. ¿Cómo puedo entonces mover con security una copy de trabajo? (Si muevo mi copy de trabajo, recibo un post de error que me dice que la ruta al gitdir roto ya no es un repository de Git)

Tenga en count que esto no es lo mismo que la pregunta anterior Mover el directory padre de un repository git que contiene submodules en el sentido de que estoy seguro de que esto no está relacionado con la presencia de una ruta absoluta en mi file .gitmodules .

La organización .git/module data de git1.7.8 (2 de diciembre de 2011) :

Al $GIT_DIR un nuevo directory de submodules con " git submodule init ", el directory de metainformación $GIT_DIR para submodules se crea dentro de $GIT_DIR/modules/<name>/ directory del superproyecto y se hace reference a través del mecanismo de files de git.
Esto es para hacer posible cambiar entre commits en el superproyecto que tiene y no tiene el submodule en el tree sin volver a clonar .

Sin embargo, las correcciones de errores recientes se han incluido en 1.8.2.1 y 1.8.3 (22 de abril de 2013):

La "actualización del submodule git", cuando se recursó en submodules secundarios, no acccumuló las routes del prefijo.

Por lo tanto, la actualización a la última versión de Git podría solucionar este problema.


Aquí, una posible solución (con el último git 1.8.3, 22 de abril de 2013), es mencionada por el OP Thomas Moulard en los comentarios :

$ git submodule deinit -f . ¡está trabajando!
Entonces puedo ejecutar git submodule init y las routes se arreglan

Esto se ocupa de si los pasos de (de) initialization ( .git/modules )

No se ocupa del paso ' add ' que registra la URL de un submodule en el file .gitmodules : aún necesita eliminarlo manualmente dentro de ese file.

Solucioné con éxito mi copy de trabajo después de moverlo a otro lugar haciendo lo siguiente:

  • Actualizando gitdir: ruta en superproject/path/to/submodule/.git file superproject/path/to/submodule/.git
  • Actualizando el worktree= en el worktree= superproject/.git/modules/path/to/submodule/config

¡No sé por qué git usa routes absolutas allí!

(Probado en Git 2.0.1.563)