How to get rid of Git submodules untracked status?
GitGit SubmodulesGit Problem Overview
I can't seem to get rid of untracked content in Git's submodules. Running git status
yields:
On branch 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: bundle/snipmate (untracked content)
modified: bundle/surround (untracked content)
modified: bundle/trailing-whitespace (untracked content)
modified: bundle/zencoding (untracked content)
no changes added to commit (use "git add" and/or "git commit -a")
Adding the --ignore-submodules
parameter hides these messages; but I wonder if there's a way to get rid of this dirt in a more suitable, core-ish, manner.
Git Solutions
Solution 1 - Git
I found this blog post to work overall. By adding the ignore = dirty
option to each one of the entries in the .gitmodules
file.
[submodule "zen-coding-gedit3"]
path = zen-coding-gedit3
url = git://github.com/leafac/zen-coding-gedit3.git
ignore = dirty
Solution 2 - Git
Since the git status reports untracked content, the actual way to have a clean status would be to go into each one of those submodules and:
-
add and commit the untracked contents,
-
or reference the untracked contents in a
.gitignore
specific to each module. -
or you can add the same ignored content to the submodule's
.git/info/exclude
, as peci1 reports in the comments. -
or add dirty to the submodule specification, as mentioned in ezraspectre's answer (upvoted).
git config -f .gitmodules submodule.<path>.ignore untracked
-
or add a global
.gitignore
file (often~/.gitignore-global
). Like for example.DS_Store
or in my caseCarthage/Build
as reported by Marián Černý in the comments. See.gitginore
man page:
> Patterns which a user wants Git to ignore in all situations (e.g., backup or temporary files generated by the user’s editor of choice) generally go into a file specified by core.excludesFile
in the user’s ~/.gitconfig
. Its default value is $XDG_CONFIG_HOME/git/ignore
. If $XDG_CONFIG_HOME
is either not set or empty, $HOME/.config/git/ignore
is used instead.
Solution 3 - Git
You can also go to each submodule dir and act as a separated git. For example:
cd my/project/submodule
git status
... /gets the list of modified files/
git add . //to add all of them to commit into submodule
git commit -m "message to your submodule repo"
you can also update your remote submodule repo with
git submodule update
after all
Solution 4 - Git
This worked out just fine for me:
git update-index --skip-worktree <path>
If it doesn't work with the pathname
, try the file name.
Let me know if this worked for you too.
Solution 5 - Git
It could be due to the detached HEAD
in your submodule branch. If this is the case, go into your submodule path (e.g.: ./bundle/snipmate
), then rungit checkout master
.
Solution 6 - Git
I got stuck on this issue yesterday, in a project which had close to 12 submodules.
git status
was showing output.
# On branch 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: proj1 (untracked content)
# modified: proj1 (modified content, untracked content)
# ...
To resolve the untracked content error, I had to remove the untracked files from all submodules (all were *.pyc
, *.pyo
files generated by python) using a .gitignore
.
To resolve the other, I had to run git submodule update
which updated each of the submodules.
Solution 7 - Git
In my situation I clone modules as a starting point for a new module in my ZF2 environment. What this does is put its own .git folder into the directory.
Solution in this case is to delete the .git folder (you will likely need to show hidden files to view it).
Solution 8 - Git
This probably happens when you have another .git [hidden folder] inside the particular folder..
modified: ./../.. (modified content, untracked content)
make sure your sub-directory does not contains this .git folder.
If That is the case the issue can be resolved by deleting the .git folder manually from the sub directory.
Solution 9 - Git
I prefer to use SourceTree, so the solution for me was to open the submodule repo in SourceTree which shows me list of all untracked files. I then group selected them all then used "Remove".
I was able to do this because I knew all the untracked files weren't actually needed.
Solution 10 - Git
If this is a temporary issue, you can go into the submodule folder and run git reset HEAD --hard
but you will lose all your changes inside of the submodule.
Solution 11 - Git
In my experience, for MacOS, this can appear because ._
files were created:
In that case: try dot_clean .