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
    CSS 3D Folding Animation

    Google Plus provides loads of inspiration for front-end developers, especially when it comes to the CSS and JavaScript wonders they create. Last year I duplicated their incredible PhotoStack effect with both MooTools and pure CSS; this time I'm going to duplicate...

  • By
    Camera and Video Control with HTML5

    Client-side APIs on mobile and desktop devices are quickly providing the same APIs.  Of course our mobile devices got access to some of these APIs first, but those APIs are slowly making their way to the desktop.  One of those APIs is the getUserMedia API...

Incredible Demos

  • By
    Implement jQuery’s hover() Method in MooTools

    jQuery offers a quick event shortcut method called hover that accepts two functions that represent mouseover and mouseout actions. Here's how to implement that for MooTools Elements. The MooTools JavaScript We implement hover() which accepts to functions; one will be called on mouseenter and the other...

  • By
    Implementing Basic and Fancy Show/Hide in MooTools 1.2

    One of the great parts of MooTools is that the library itself allows for maximum flexibility within its provided classes. You can see evidence of this in the "Class" class' implement method. Using the implement method, you can add your own methods to...

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!