75

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?

1

7 Answers 7

71

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

Sign up to request clarification or add additional context in comments.

1 Comment

+1 seems obvious, but this stumped me for a bit. My submodule was not ignoring anything, but the root repo was.
62

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.

Comments

29

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 

5 Comments

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.
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
i like clean and fast solution :)
I tried your solution and got a Skipping repository ... exactly on the submodule which has the untracked changes
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? :)
13

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

Comments

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

4 Comments

After running this I still have a submodule with "modified content"
@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
In my opinion the answer by @bloke_zero is the best one. No need to modify .gitignore or add "ignore dirty" to .gitmodules
I tried your solution and got a Skipping repository ... exactly on the submodule which has the untracked changes.
1

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

git config --global core.excludesfile '~/.cvsignore' echo tags >> ~/.cvsignore 

Comments

0

I had a project with submodules that in turn had submodules themselves. I performed git submodule update --init --remote on the top-level project, which got me a modified content marking. That was due to the submodule of the submodule having had new commits added upstream, which were pulled in by the update command, but they appeared as modifications because the top-level submodule had not been updated yet to reference the new commits in its submodule configuration. Since I was maintaining that submodule too, the easy fix was to go into the repository of that submodule, update its submodules then git commit 3rdparty (where 3rdparty contained the submodule's submodules) then git push, and finally updating the submodules of the top-level project again.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.