How to change git submodules url locally?
Not only you can change the submodule URL with git config submodule.moduleName.url
, but:
With Git 2.25 (Q1 2020), you can modify it.
See "Git submodule url changed" and the new commandgit submodule set-url [--] <path> <newurl>
with Git 2.22 (Q2 2019), you can also unset it:
See commit b57e811, commit c89c494 (08 Feb 2019), and commit 7a4bb55 (07 Feb 2019) by Denton Liu (Denton-L
).
(Merged by Junio C Hamano -- gitster
-- in commit 01f8d78, 25 Apr 2019)
submodule--helper
: teach config subcommand--unset
This teaches
submodule--helper config
the--unset
option, which removes the specified configuration key from the.gitmodule
file.
That is:
git submodule--helper config --unset submodule.submodule.url &&
git submodule--helper config submodule.submodule.url >actual &&
test_must_be_empty actual
With Git 2.27 (Q2 2020), the rewriting various parts of "git submodule
" in C continues, include set-url
.
See commit 6417cf9 (08 May 2020) by Shourya Shukla (periperidip
).
(Merged by Junio C Hamano -- gitster
-- in commit 9e8ed17, 13 May 2020)
submodule
: port subcommand 'set-url' from shell to CSigned-off-by: Shourya Shukla
Convert submodule subcommand 'set-url' to a builtin. Port '
set-url
' to 'submodule--helper.c
' and call the latter via 'git submodule.sh
'.
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
I believe this approach has advantages over the accepted answer:
$ git submodule set-url moduleName ssh://user@server/path
$ git restore .gitmodules # or: git reset HEAD .gitmodules
This will change the URL everywhere, and then set it back to the previous value in the one place you don't want to change (.gitmodules
).
Why this is better than the accepted answer: when setting the URL with git config submodule.moduleName.url
, the command used to propagate this change into the actual submodule checkout is git submodule update --remote
. However, updating the URL is only a side effect of that command, its main use is to (potentially) check out a different commit in the submodule. On the other hand, set-url
only does what it says on the can.