Remove a Submodule within git
For many git-based projects, submodules are useful in avoiding duplicate work and easing utility library updates. There are times, however, when a submodule needs to be removed from a project. Submodules aren't removed with git rm submoduledir, they must be removed in a more tedious, manual fashion. There are many unclear explanations of how to remove a submodule but I found one on Stack Overflow that's concise, so I thought I'd share it. The steps are as follows:
- Delete the relevant section from the
.gitmodules
file. The section would look similar to:[submodule "vendor"] path = vendor url = git://github.com/some-user/some-repo.git
- Stage the
.gitmodules
changes via command line using:git add .gitmodules
- Delete the relevant section from
.git/config
, which will look like:[submodule "vendor"] url = git://github.com/some-user/some-repo.git
- Run
git rm --cached path/to/submodule
. Don't include a trailing slash -- that will lead to an error. - Run
rm -rf .git/modules/submodule_name
- Commit the change:
- Delete the now untracked submodule files
rm -rf path/to/submodule
Those steps will get you rid of that unwanted submodule. A lot harder than adding one, eh?
Just an interesting side note, as of git 1.8.3, you can use
git submodule deinit
to handle a lot of the heavy lifting of removing a submodule.deinit didn’t work for me; these instructions did (as of git 1.9.3)
Funny, I had this problem just yesterday! Thanks anyway, I’ll remember where the manual is)
I found a handy bash script that automates this https://gist.github.com/sharplet/6289697
Change to a directory that’s in your PATH, I used /usr/local/bin and run the following commands:
$ curl -o git-remove-submodule https://gist.github.com/sharplet/6289697/raw/git-remove-submodule
$ chmod 755 git-remove-submodule
Then to remove a submodule run:
$ git remove-submodule path/to/submodule
These instructions are no longer current, I wouldn’t use them.
This should NOT be used… ‘git rm path/to/submodule’ will work fine on recent git versions.
Thank you so much for this!
I have a project that I am deploying to AWS, and while I want to keep sub folder repos able to push and pull, I don’t want the parent repo to treat them as submodules, because AWS doesn’t init and pull submodules, resulting in empty submodule folders on deployment.
By using your steps here I was able to keep the files and still keep the folder contents in my repo.