73

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?

nocksock
  • 5,369
  • 6
  • 38
  • 63

6 Answers6

68

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

Mark Longair
  • 446,582
  • 72
  • 411
  • 327
  • +1 seems obvious, but this stumped me for a bit. My submodule was not ignoring anything, but the root repo was. – bentford Apr 24 '12 at 23:10
59

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.

ciastek
  • 1,343
  • 12
  • 15
28

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
Maurizio
  • 4,143
  • 1
  • 29
  • 28
  • 2
    I found that even though the untracked files didn't actually exist on disk, Git seemed to be behaving as if they were. I don't know why this happened, but using the clean command as per your example worked. – David Oliver Sep 04 '14 at 17:33
  • 4
    Thank you for removing everything that was under .gitignore. Now my entire IDE configuration and vendor cache is gone... N.B. this will remove everything that is .gitignore'd – Michael Yoo Jul 14 '15 at 13:13
  • 1
    i like clean and fast solution :) – vivi Jan 22 '19 at 15:34
  • I tried your solution and got a `Skipping repository ...` exactly on the submodule which has the untracked changes – desmond13 Nov 27 '20 at 14:57
  • This worked for me. :) @MichaelYoo Dunno if an IDE should be littering a submodule with its configuration files... Good caution for those who use IDEs - but which one did this silly thing? :) – Jesse Adelman May 24 '21 at 14:41
12

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

Francis Bacon
  • 4,080
  • 1
  • 37
  • 48
9

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

bloke_zero
  • 508
  • 7
  • 12
  • 1
    After running this I still have a submodule with "modified content" – Peter Mar 27 '19 at 22:06
  • @Peter git clean removes untracked files. Modified content on the other hand is not touched by git clean. To get rid of that you can do `git submodule update --checkout --recursive` – Potaito Nov 24 '20 at 15:04
  • In my opinion the answer by @bloke_zero is the best one. No need to modify `.gitignore` or add "ignore dirty" to `.gitmodules` – Potaito Nov 24 '20 at 15:06
  • I tried your solution and got a `Skipping repository ...` exactly on the submodule which has the untracked changes. – desmond13 Nov 27 '20 at 14:55
1

As the author of pathogen states in the FAQ, you can ignore tags globally:

git config --global core.excludesfile '~/.cvsignore'
echo tags >> ~/.cvsignore
Garrett Hyde
  • 5,409
  • 8
  • 49
  • 55
flycarl
  • 11
  • 2