¿Hay alguna forma de rebuild un directory .git para un submodule?

Tengo un proyecto con un submodule y quiero poder rebuild el directory .git del submodule, como si el submodule hubiera sido clonado.

En más detalle, digamos que tengo un subproject submodule en un superproject proyecto git, y ya lo he hecho:

 git clone git://url.of.superproject cd superproject git submodule update --init 

subproject no tiene su propio directory .git , sino un file .git , que apunta al directory ../.git/modules/subproject . Realmente necesito el directory .git real para el subproject , porque la herramienta que estoy usando (Python's pip) insiste en copyr el directory del subproject a una location arbitraria para trabajar en él, y el trabajo que hará incluye ejecutar commands git.

¿Hay alguna forma de rebuild el directory del subproject/.git como si hubiera sido clonado? No puedo simplemente copyr el .git/modules/subproject porque contiene enlaces relativos a otras partes del directory superproject/.git .

Para responder a mi propia pregunta, el git clone subproject creará el directory .git :

 git clone --recursive subproject subproject-copy 

Ahora subproject-copy/.git es un directory completo de git.

Aquí hay una function bash para hacer esto de una manera más general (reconstruyendo el control remoto de origin correctamente, etc.):

 function fill_submodule { # Restores .git directory to submodule, if necessary local repo_dir="$1" [ -z "$repo_dir" ] && echo "repo_dir not defined" && exit 1 local git_loc="$repo_dir/.git" # For ordinary submodule, .git is a file. [ -d "$git_loc" ] && return # Need to recreate .git directory for submodule local origin_url=$(cd "$repo_dir" && git config --get remote.origin.url) local repo_copy="$repo_dir-$RANDOM" git clone --recursive "$repo_dir" "$repo_copy" rm -rf "$repo_dir" mv "$repo_copy" "$repo_dir" (cd "$repo_dir" && git remote set-url origin $origin_url) } 

Usar con:

 fill_submodule subproject