Rename a git submodule
The correct solution is:
mv oldpath ~/another-location
git rm oldpath
git submodule add submodule-repository-URL newpath
Git1.8.5 (October 2013) should simplify the process. Simply do a:
git mv A B
"
git mv A B
", when moving a submoduleA
has been taught to relocate its working tree and to adjust the paths in the.gitmodules
file.
See more in commit 0656781fadca1:
Currently using "
git mv
" on a submodule moves the submodule's work tree in that of the superproject. But the submodule's path setting in.gitmodules
is left untouched, which is now inconsistent with the work tree and makes git commands that rely on the properpath -> name mapping
(likestatus
anddiff
) behave strangely.Let "
git mv
" help here by not only moving the submodule's work tree but also updating the "submodule.<submodule name>.path
" setting from the.gitmodules
file and stage both.
This doesn't happen when no.gitmodules
file is found and only issues a warning when it doesn't have a section for this submodule. This is because the user might just use plain gitlinks without the.gitmodules
file or has already updated the path setting by hand before issuing the "git mv" command (in which case the warning reminds him thatmv
would have done that for him).
Only when.gitmodules
is found and contains merge conflicts themv
command will fail and tell the user to resolve the conflict before trying again.
git 2.9 (June 2016) will improve git mv
for submodule:
See commit a127331 (19 Apr 2016) by Stefan Beller (stefanbeller
).
(Merged by Junio C Hamano -- gitster
-- in commit 9cb50a3, 29 Apr 2016)
mv
: allow moving nested submodules"
git mv old new
" did not adjust the path for a submodule that lives as a subdirectory insideold/
directory correctly.submodules however need to update their link to the git directory as well as updates to the
.gitmodules
file.
I found following workflow working:
- Update .gitmodules
mv oldpath newpath
git rm oldpath
git add newpath
git submodule sync
Note: this approach does not update the index and .gitmodules
properly in 2018 versions of GIT.
Note: You may be able to just do git mv oldpath newpath
now, as pointed out in VonC's answer. (Ensure you are using the latest version of git)