Cómo cambiar la URL de los submodules de Git localmente?

El file .gitmodules original usa las URL https codificadas, pero para algunas testings automatizadas, hago una clonación desde ssh y hago que las direcciones URL del submodule sean relativas como en ../ModuleName . Tampoco quiero volver a introducir estos cambios en el repository.

 # change the https://github.com/ with git@github.com: sed -i 's/https:\/\/github.com\//git@github.com:/g' ".git/config" # delete the url lines from the submodule blocks of .git/config sed -i '/submodule/ {$!N;d;}' ".git/config" # change hardcoded https:// urls of submodules to relative ones sed -i 's/https:\/\/github.com\/ProjName/../g' ".gitmodules" # also make the same change in the .git/modules/*/config sed -i 's/https:\/\/github.com\/ProjName/../g' .git/modules/*/config # sync and update git submodule sync git submodule update --init --recursive --remote 

Con el fragment de arriba, hace lo que quiero. Sin embargo, lo molesto es que .git/modules/ folder no parece estar bajo el control de la versión, pero si simplemente lo git submodule sync , git submodule sync y la mayoría de las demás operaciones de Git dejan de funcionar.

¿Hay alguna manera de regenerar el .git/modules después de modificar los .gitmodules y .git/config ?

Si desea modificar la URL utilizada para un submodule solo para el repository local, entonces no modifique el file .gitmodules , esto es solo para los cambios que desea realizar.

En su lugar, primero inicialice la configuration del submodule local:

 git submodule init 

Luego modifique el file .git/config para cambiar la URL del submodule como de costumbre. (De nuevo, no es necesario modificar .gitmodules aquí, y si se trata de un nuevo clon, probablemente aún no tenga .git/modules ).

Como señala @jthill , una forma más fácil de modificar las URL de los submodules es:

 git config submodule.moduleName.url ssh://user@server/path 

En este punto , no desea ejecutar la git submodule sync porque eso sobrescribirá los cambios que acaba de realizar con los valores del file .gitmodules . En su lugar, ve directamente a:

 git submodule update --recursive --remote