I've added a submodule to my project in project_dir/vendor/submodule_one
now each time I run git status
I get modified: vendor/submodule_one (new commits)
.
My question is whats the best way to deal with this? Do I add the vendor/submodule_one
-folder to my .gitignore
as my main project shouldn't need to know about the specifics of my submodule?
Or when I'm changing and commiting changes to my submodule do I need to make commits in my main project also?
Just getting started with submodules and couldn't seem to find much info beyond setting them up.
You can also change the commit that is checked out in each submodule by performing a checkout in the submodule repository and then committing the change in the parent repository. You add a submodule to a Git repository via the git submodule add command.
If you set ignore = all, to get sane behavior with git commit -a, it will ALSO ignore the submodule in git show/diff when you EXPLICITLY add them. The only way to work-around the latter is using the command line option --ignore-submodule=none.
This is because of some major drawbacks around git submodules, such as being locked to a specific version of the outer repo, the lacking of effective merge management, and the general notion that the Git repository itself doesn't really know it's now a multi-module repository.
In most cases, Git submodules are used when your project becomes more complex, and while your project depends on the main Git repository, you might want to keep their change history separate. Using the above as an example, the Room repository depends on the House repository, but they operate separately.
No, you don't need to add your submodule to your .gitignore
: what the parent will see from your submodule is a gitlink (a special entry, mode 160000
).
That means: any change directly made in a submodule needs to be followed by a commit in the parent directory.
That way, the parent directory will record the right commit for the state of the submodule: That commit is the "gitlink" mentioned above;
You can read more about that policy in "git submodule update (true nature of submodules)".
The main idea behind submodules is a component-based approach, where you reference other repos at specific commits. But if you change anything in those submodules, you need to update those references in the parent repo as well.
Note that with Git 2.13 (Q2 2017), while not ignoring the gitlink, you can still ignore the submodule with:
git config submodule.<name>.active false
See more at "Ignore new commits for git submodule".
Note: with Git 2.15.x/2.16 (Q1 2018), ignoring a submodule is more precise.
"git status --ignored --untracked
" did not stop at a working tree of a separate project that is embedded in an ignored directory and listed files in that other project, instead of just showing the directory itself as ignored.
See commit fadb482 (25 Oct 2017) by Johannes Schindelin (dscho
).
(Merged by Junio C Hamano -- gitster
-- in commit da7996a, 06 Nov 2017)
status
: do not get confused by submodules in excluded directoriesWe meticulously pass the
exclude
flag to thetreat_directory()
function so that we can indicate that files in it are excluded rather than untracked when recursing.But we did not yet treat submodules the same way.
Because of that,
git status --ignored --untracked
with a submodulesubmodule
in a gitignoredtracked/
would show the submodule in the "Untracked files
" section, e.g.
On branch master Untracked files: (use "git add <file>..." to include in what will be committed) tracked/submodule/ Ignored files: (use "git add -f <file>..." to include in what will be committed) tracked/submodule/initial.t
Instead, we would want it to show the submodule in the "
Ignored files
" section:
On branch master Ignored files: (use "git add -f <file>..." to include in what will be committed) tracked/submodule/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With