diff-index does not consider a removed submodule to be staged with --ignore-submodules

2 messages, 2 authors, 2016-06-15 · open the first message on its own page

diff-index does not consider a removed submodule to be staged with --ignore-submodules

From: Daniel Hahler <hidden>
Date: 2016-06-15 23:02:33

After staging the removal of a submodule, diff-index does not consider this when "--ignore-submodules" is being used:

    # In a repository with submodule "sm":
    % git rm --cached sm
    % git diff-index --cached --quiet --ignore-submodules HEAD
    % echo $?
    0
    % git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)

        deleted:    sm

"git status --ignore-submodules" behaves the same.
From the man page of "--ignore-submodules" it looks like the option is meant to prevent scanning of submodules itself, but in this case the main repository is affected.
This command is used by zsh's vcs_info module (in Functions/VCS_Info/Backends/VCS_INFO_get_data_git):

    if (( querystaged )) ; then
        if ${vcs_comm[cmd]} rev-parse --quiet --verify HEAD &> /dev/null ; then
            ${vcs_comm[cmd]} diff-index --cached --quiet --ignore-submodules HEAD 2> /dev/null
            (( $? && $? != 128 )) && gitstaged=1

Is this a bug/oversight in Git or by design?
Is there a better way to detect if there are any staged changes?


Regards,
Daniel.

-- 
http://daniel.hahler.de/

Re: diff-index does not consider a removed submodule to be staged with --ignore-submodules

From: Jens Lehmann <hidden>
Date: 2016-06-15 23:02:34

Am 20.09.2014 um 18:20 schrieb Daniel Hahler:
After staging the removal of a submodule, diff-index does not consider this when "--ignore-submodules" is being used:

     # In a repository with submodule "sm":
     % git rm --cached sm
     % git diff-index --cached --quiet --ignore-submodules HEAD
     % echo $?
     0
     % git status
     On branch master
     Changes to be committed:
       (use "git reset HEAD <file>..." to unstage)

         deleted:    sm

"git status --ignore-submodules" behaves the same.
quoted
From the man page of "--ignore-submodules" it looks like the option is meant to prevent scanning of submodules itself, but in this case the main repository is affected.
Sorry, but I don't know what man page you are talking about here ...
This command is used by zsh's vcs_info module (in Functions/VCS_Info/Backends/VCS_INFO_get_data_git):

     if (( querystaged )) ; then
         if ${vcs_comm[cmd]} rev-parse --quiet --verify HEAD &> /dev/null ; then
             ${vcs_comm[cmd]} diff-index --cached --quiet --ignore-submodules HEAD 2> /dev/null
             (( $? && $? != 128 )) && gitstaged=1

Is this a bug/oversight in Git or by design?
Is there a better way to detect if there are any staged changes?
It might be that --ignore-submodules=dirty is what you want. It will
report changes in the committed submodule SHA-1, added and removed
submodules but won't care about any modifications inside the submodule.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help