How to fix a directory that Git thinks is a submodule

 Posted on 
 ·  1 minutes reading time

Nuts. I added and committed a directory to my Git repository when the directory itself was another separate Git repository. Now Git thinks it's some sort of submodule, but it doesn't know how to deal with it:

1
2
$ git submodule update
No submodule mapping found in .gitmodules for path 'blah'

And worse, Git won't let me remove it:

1
2
3
4
5
$ git rm blah
error: the following submodule (or one of its nested submodules)
uses a .git directory:
    blah
(use 'rm -rf' if you really want to remove it including all of its history)

So what to do? This:

1
2
$ git rm --cached blah
$ git add blah

In my case I had a situation where there were several Git repositories-inside-a-repository, so I wanted a way to deal with them all:

1
2
3
4
5
6
$ for i in `find . -type d -name .git -print | sed 's#/.git##'`; do 
> echo $i
> rm -rf $i/.git
> git rm --cached $i
> git add $i
> done

(Be careful not to run this find command at the root of your Git repository, of course, or else you will effectively destroy its usefulness as a git repo. )