Remove a Submodule within git

By  on  

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:

  1. 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
    
  2. Stage the .gitmodules changes via command line using:git add .gitmodules
  3. Delete the relevant section from .git/config, which will look like:
    [submodule "vendor"]
    	url = git://github.com/some-user/some-repo.git
    
  4. Run git rm --cached path/to/submodule .  Don't include a trailing slash -- that will lead to an error.
  5. Run rm -rf .git/modules/submodule_name
  6. Commit the change:
  7. 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?

Recent Features

  • By
    Responsive and Infinitely Scalable JS Animations

    Back in late 2012 it was not easy to find open source projects using requestAnimationFrame() - this is the hook that allows Javascript code to synchronize with a web browser's native paint loop. Animations using this method can run at 60 fps and deliver fantastic...

  • By
    5 Ways that CSS and JavaScript Interact That You May Not Know About

    CSS and JavaScript:  the lines seemingly get blurred by each browser release.  They have always done a very different job but in the end they are both front-end technologies so they need do need to work closely.  We have our .js files and our .css, but...

Incredible Demos

  • By
    Font Replacement Using Cufón

    We all know about the big font replacement methods. sIFR's big. Image font replacement has gained some steam. Not too many people know about a great project named Cufón though. Cufón uses a unique blend of a proprietary font generator tool...

  • By
    MooTools CountDown Plugin

    There are numerous websites around the internet, RapidShare for example, that make you wait an allotted amount of time before presenting you with your reward. Using MooTools, I've created a CountDown plugin that allows you to easily implement a similar system. The MooTools JavaScript The CountDown class...

Discussion

  1. 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.

    • Sam

      deinit didn’t work for me; these instructions did (as of git 1.9.3)

  2. Funny, I had this problem just yesterday! Thanks anyway, I’ll remember where the manual is)

  3. 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

  4. Joe

    These instructions are no longer current, I wouldn’t use them.

  5. Kurt

    This should NOT be used… ‘git rm path/to/submodule’ will work fine on recent git versions.

  6. Brian Berneker

    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.

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!