update submodules submodule remote recursive absorbgitdirs git git-submodules

submodules - Asegurando rutas de Git relativas



git submodule update recursive (3)

He movido un repositorio Git (que contiene varios submódulos) a otro directorio del disco local. Cualquier comando git produce el error:

fatal: Not a git repository: <absolute path to .git/modules/*>

El error se deriva de rutas absolutas a archivos codificados en varios lugares [1]. Dos preguntas:

  • ¿Hay un comando Git para corregir estas rutas, es decir, hacerlas relativas? [2]
  • ¿Hay alguna forma de garantizar que los futuros repositorios de Git solo usen rutas relativas? [3]

¡Gracias!

Notas

  1. Noté que con todos los submódulos, el archivo .git contiene:

    gitdir: <absolute path to repository>

    El parámetro core.worktree dentro de cada submódulo ( .git/modules/*/config ) se establece en la ruta absoluta de ese submódulo.

  2. No estoy buscando un comando de shell, sino un método Git nativo.

  3. No estoy seguro de si las rutas absolutas se crearon con una versión anterior de Git, y más recientes que desde entonces han adoptado rutas relativas.


Escribí un oneliner (bash y coreutils requerido) que cambia cualquier archivo .git gitdir en una ruta relativa:

find -type f -name .git -exec bash -c ''f="{}"; cd $(dirname $f); echo "gitdir: $(realpath --relative-to=. $(cut -d" " -f2 .git))" > .git'' /;

Y si no te gusta encontrar aquí hay uno con git submódulo:

git submodule foreach --recursive ''[[ -f .git ]] && echo "gitdir: $(realpath --relative-to=. $(cut -d" " -f2 .git))" > .git''


Me he encontrado con el mismo problema.

Aquí hay un resumen de un pequeño guión que escribí, lo que podría ayudar.

Realmente no resuelve el problema al convertir las rutas a una forma relativa, pero sí realiza una búsqueda y reemplazo rápidos en las ubicaciones relevantes, lo que le permite arreglar todo. Especialmente útil si se trata de un conjunto complejo de submódulos donde puede haber muchos caminos que corregir.

Tenga en cuenta que yo mismo he usado este script en OS X 10.8, pero no puedo estar 100% seguro de que funcione en todos los casos, ¡así que tenga cuidado y tome precauciones razonables!

https://gist.github.com/3394771


Solución @ r3dey3 adaptada para Windows :

git submodule foreach --recursive ''[[ -f .git ]] && chmod +w .git && echo "gitdir: $(realpath --relative-to=. "$(cygpath -u "$(cut -d" " -f2 .git)")")" > .git''

Aquí he añadido:

  • chmod +w .git para eliminar el atributo de solo lectura
  • cygpath -u llama para convertir la ruta de Windows a la ruta de Unix