abdus_salam abdus_salam - 4 years ago 344
Git Question

How to change git submodules url locally?

The original

file uses the hard coded
urls but for some automated tests I clone from
and make the submodule urls relative as in
. I don't want to push these changes back into the repo either.

# 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

With the snippet above, it does what I want. However, the annoying thing is,
folder doesn't seem to be under version control but if I just delete it,
git submodule sync
and most other Git operations just stop working.

Is there a way to get the
regenerated after modifying the

Answer Source

If you want to modify the URL used for a submodule only for the local repo, then don't modify the .gitmodules file, that is only for changes that you want to push.

Instead, first initialize the local submodule config:

git submodule init

Then modify the .git/config file to change the submodule URL as usual. (Again, no need to modify .gitmodules here, and if this is a new clone you probably won't have .git/modules yet.)

As @jthill points out, an easier way to modify the submodule URLs is:

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

At this point you don't want to run git submodule sync, because that will overwrite the changes you just made with the values from the .gitmodules file. Instead, go straight to:

git submodule update --recursive --remote
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download