Subject: Re: [PATCH 0/5] git-add : Respect submodule ignore=all and only add changes with --force

From: Phillip Wood <[email-masked]>
Date: Sun, 19 Oct 2025 16:34:19 +0100

Hi Claus

[I've adjusted the CC list slightly]

On 18/10/2025 21:07, Claus Schneider via GitGitGadget wrote:
> The feature of configuring a submodule to "ignore=all" is nicely respected
> in commands "status" and "diff". However the "add" command does not respect
> the configuration the same way.

I was curious why, when "git add" uses the same machinery as "git diff" 
to figure out which paths need updating, it behaves differently. It 
turns out that add_files_to_cache() contains

	rev.diffopt.flags.override_submodule_config = 1;

which makes "git add" ignore "submodule.<name>.ignore". Tracing the 
history of this line, it originates from 5556808690e (add, reset: ensure 
submodules can be added or reset, 2017-07-25) which made a deliberate 
choice for both "git add" and "git reset" not to behave like "git diff". 
If we're going to change the behavior then it would be helpful to 
explain how this patch series ameliorates the concerns that lead to that 
commit and why it is sensible to change the behavior of "git add" but 
not "git reset". It also suggests that a much simpler way of 
implementing the change would be to delete that line.

I'm not convinced that the approach of using "--force" is a good idea as 
it conflates ignoring changes to tracked paths (which is what 
submodule.<name>.ignore" does) with ignoring untracked paths (which is 
what ".gitignore" does). If we're happy to break existing uses that rely 
on the current behavior then having a new option to override 
submodule.<name>.ignore strikes me as a better way forward. I don't have 
much experience of using submodules so I can't comment on whether 
changing the behavior is a good idea or not.

Thanks

Phillip

  The behavior is problematic for the logic
> between status/diff and add. Secondly it makes it problematic to track
> branches in the submodule configuration as developers unintentionally keeps
> add submodule updates and get conflicts for no intentional reason. Both adds
> unnecessary friction to the usage of submodules.
> 
> The patches implement the same logical behavior for ignore=all submodules as
> regular ignored files. The status now does not show any diff - nor will the
> add command update the reference submodule reference. If you add the
> submodule path which is ignore=all then you are presented with a message
> that you need to use the --force option. The branch=, ignore=all (and
> update=none) now works great with update --remote, but developers does not
> have to consider changes in the updates of the submodule sha1. The
> implementation removes a friction of working with submodules and can be used
> like the repo tool with branches configured. The submodule status report
> could be used for build/release documentation for reproduction of a setup.
> 
> A few tests used the adding of submodules without --force, hence they have
> been updated to use the --force option.
> 
> Claus Schneider(Eficode) (5):
>    read-cache: update add_files_to_cache to take param
>      ignored_too(--force)
>    read-cache: let read-cache respect submodule ignore=all and --force
>    tests: add new t2206-add-submodule-ignored.sh to test ignore=all
>      scenario
>    tests: fix existing tests when add an ignore=all submodule
>    Documentation: update add --force and submodule ignore=all config
> 
>   Documentation/git-add.adoc       |   4 +-
>   Documentation/gitmodules.adoc    |   5 +-
>   builtin/add.c                    |   2 +-
>   builtin/checkout.c               |   2 +-
>   builtin/commit.c                 |   2 +-
>   read-cache-ll.h                  |   2 +-
>   read-cache.c                     |  54 ++++++++++++-
>   t/lib-submodule-update.sh        |   6 +-
>   t/meson.build                    |   1 +
>   t/t2206-add-submodule-ignored.sh | 134 +++++++++++++++++++++++++++++++
>   t/t7508-status.sh                |   2 +-
>   11 files changed, 202 insertions(+), 12 deletions(-)
>   create mode 100755 t/t2206-add-submodule-ignored.sh
> 
> 
> base-commit: c44beea485f0f2feaf460e2ac87fdd5608d63cf0
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1987%2FPraqma%2Frespect-submodule-ignore-v1
> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1987/Praqma/respect-submodule-ignore-v1
> Pull-Request: https://github.com/gitgitgadget/git/pull/1987