git submodules with modified and untracked content - why and how to remove it?

this is what my git status' result looks like:

# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   vim/bundle/pathogen (modified content)
#   modified:   vim/bundle/sparkup (untracked content)
#
no changes added to commit (use "git add" and/or "git commit -a")

running git diff vim shows this:

diff --git a/vim/bundle/pathogen b/vim/bundle/pathogen
--- a/vim/bundle/pathogen
+++ b/vim/bundle/pathogen
@@ -1 +1 @@
-Subproject commit fcf77f5101f3e589ce006c40ad3a0432735a05cf
+Subproject commit fcf77f5101f3e589ce006c40ad3a0432735a05cf-dirty
diff --git a/vim/bundle/sparkup b/vim/bundle/sparkup
--- a/vim/bundle/sparkup
+++ b/vim/bundle/sparkup
@@ -1 +1 @@
-Subproject commit 04a81b41f116a19184359a6f8685c192f5c36c70
+Subproject commit 04a81b41f116a19184359a6f8685c192f5c36c70-dirty

Why is the one untracked, the other modified, what does the diff mean? But most important: how did it happen and how to get rid of it?


One of the tracked files in vim/bundle/pathogen has been modified somehow. There is also some untracked (and unignored) content in the submodule vim/bundle/sparkup. In either case, the way to figure out what is modified / untracked is to change into the submodule directory and run git status. (In the case of untracked files in a submodule, this is frequently a build product that has not been added to .gitignore in upstream.)


Add ignore = dirty to each problematic submodule section in .gitmodules files placed at root of repo. Example:

[submodule "vim/bundle/nerdtree"]                                               
  path = vim/bundle/nerdtree                                                    
  url = https://github.com/scrooloose/nerdtree.git                              
  ignore = dirty

As seen at NilsH's How to ignore changes in git submodules. Found thanks to Synchronizing plugins with git submodules and pathogen vimcast.


Head into the submodule's directory and make sure there isn't anything being built (an output of some kind) w/o you knowing.

cd submoduledir/
git status

If you see any untracked files in here, just do this to remove them:

git reset --hard HEAD
git clean -fxd

I encountered the same situation:

gongzelong:shadowsocks-android gongzelong$ git status On branch master Your branch is up to date with 'origin/master'.

Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) (commit or discard the untracked or modified content in submodules)

    modified:   core/src/main/jni/badvpn (modified content)
    modified:   core/src/main/jni/libancillary (modified content)
    modified:   core/src/main/jni/libevent (modified content)
    modified:   core/src/main/jni/redsocks (modified content)
    modified:   core/src/overture/src/github.com/shadowsocks/overture (modified

content)

no changes added to commit (use "git add" and/or "git commit -a")

When I git diff to see what is the changes:

gongzelong:shadowsocks-android gongzelong$ git diff
diff --git a/core/src/main/jni/badvpn b/core/src/main/jni/badvpn
--- a/core/src/main/jni/badvpn
+++ b/core/src/main/jni/badvpn
@@ -1 +1 @@
-Subproject commit 58f8a8883e51e5cb97391c4b6733ce255bf11f95
+Subproject commit 58f8a8883e51e5cb97391c4b6733ce255bf11f95-dirty
diff --git a/core/src/main/jni/libancillary b/core/src/main/jni/libancillary
--- a/core/src/main/jni/libancillary
+++ b/core/src/main/jni/libancillary
@@ -1 +1 @@
-Subproject commit 311e5d14f593f16c785bc6605220517eb1f21f6b
+Subproject commit 311e5d14f593f16c785bc6605220517eb1f21f6b-dirty
diff --git a/core/src/main/jni/libevent b/core/src/main/jni/libevent
--- a/core/src/main/jni/libevent
+++ b/core/src/main/jni/libevent
@@ -1 +1 @@
-Subproject commit f29f07bc8c43eec96f227e6f6eede32b3af66168
+Subproject commit f29f07bc8c43eec96f227e6f6eede32b3af66168-dirty
diff --git a/core/src/main/jni/redsocks b/core/src/main/jni/redsocks
--- a/core/src/main/jni/redsocks
+++ b/core/src/main/jni/redsocks
@@ -1 +1 @@
-Subproject commit 274334f14839431ae003774d99c3d1de337afff4
+Subproject commit 274334f14839431ae003774d99c3d1de337afff4-dirty
diff --git a/core/src/overture/src/github.com/shadowsocks/overture b/core/src/overture/src/github.com/shadowsocks/overture
--- a/core/src/overture/src/github.com/shadowsocks/overture
+++ b/core/src/overture/src/github.com/shadowsocks/overture
@@ -1 +1 @@
-Subproject commit a9b5a94e215c1beadfe11442994b550e1e81f8d6
+Subproject commit a9b5a94e215c1beadfe11442994b550e1e81f8d6-dirty

I fixed it like this:

gongzelong:shadowsocks-android gongzelong$ git submodule update --init gongzelong:shadowsocks-android gongzelong$ git submodule foreach git reset --hard Entering 'core/src/main/jni/badvpn'

HEAD is now at 58f8a88 Fix bug UDP checksum calculation. Entering 'core/src/main/jni/libancillary' HEAD is now at 311e5d1 Fix C++ building Entering 'core/src/main/jni/libev' HEAD is now at 5213419 Merge pull request #2 from Mygod/master Entering 'core/src/main/jni/libevent' HEAD is now at f29f07bc Update to 2.1.8 Entering 'core/src/main/jni/libsodium' HEAD is now at c5e43f4c Update dotnet example version Entering 'core/src/main/jni/mbedtls' HEAD is now at 4f0929189 Update version number to 2.6.1 Entering 'core/src/main/jni/pcre' HEAD is now at 222bbf4 Merge "pcre: silence uninteresting warnings." am: 0e44fd55f8 Entering 'core/src/main/jni/redsocks' HEAD is now at 274334f Use standard ANDROID preprocessor macro (#1) Entering 'core/src/main/jni/shadowsocks-libev' HEAD is now at 57e74ea Fix a bug in bypassing Entering 'core/src/overture/src/github.com/shadowsocks/overture' HEAD is now at a9b5a94 Format the source code gongzelong:shadowsocks-android gongzelong$ gongzelong:shadowsocks-android gongzelong$ git status On branch master Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

Reference: git-discard-submodule-changes


If you're really sure you want to just do it (I'm managing vim bundles with pathogen and git submodules and some how I managed to get some tags folders in repos - and they just had to go) you can loop through submodules and remove untracked files.

cd YOUR_REPO_WITH_SUBMODULES/
git submodule foreach git clean -f -d

-f to force, -d to remove directories

You can check the docs here: https://git-scm.com/docs/git-clean