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
    LightFace:  Facebook Lightbox for MooTools

    One of the web components I've always loved has been Facebook's modal dialog.  This "lightbox" isn't like others:  no dark overlay, no obnoxious animating to size, and it doesn't try to do "too much."  With Facebook's dialog in mind, I've created LightFace:  a Facebook lightbox...

  • By
    Creating Scrolling Parallax Effects with CSS

    Introduction For quite a long time now websites with the so called "parallax" effect have been really popular. In case you have not heard of this effect, it basically includes different layers of images that are moving in different directions or with different speed. This leads to a...

Incredible Demos

  • By
    Image Manipulation with PHP and the GD Library

    Yeah, I'm a Photoshop wizard. I rock the selection tool. I crop like a farmer. I dominate the bucket tool. Hell, I even went as far as wielding the wizard wand selection tool once. ...OK I'm rubbish when it comes to Photoshop.

  • By
    Introducing MooTools LazyLoad

    Once concept I'm very fond of is lazy loading. Lazy loading defers the loading of resources (usually images) until they are needed. Why load stuff you never need if you can prevent it, right? I've created LazyLoad, a customizable MooTools plugin that...

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!