Merge branch 'jl/status-added-submodule-is-never-ignored'
submodule.*.ignore and diff.ignoresubmodules are used to ignore all submodule changes in "diff" output, but it can be confusing to apply these configuration values to status and commit. This is a backward-incompatible change, but should be so in a good way (aka bugfix). * jl/status-added-submodule-is-never-ignored: commit -m: commit staged submodules regardless of ignore config status/commit: show staged submodules regardless of ignore config
This commit is contained in:
commit
6d681f0a3e
@ -2301,7 +2301,9 @@ status.submodulesummary::
|
|||||||
--summary-limit option of linkgit:git-submodule[1]). Please note
|
--summary-limit option of linkgit:git-submodule[1]). Please note
|
||||||
that the summary output command will be suppressed for all
|
that the summary output command will be suppressed for all
|
||||||
submodules when `diff.ignoreSubmodules` is set to 'all' or only
|
submodules when `diff.ignoreSubmodules` is set to 'all' or only
|
||||||
for those submodules where `submodule.<name>.ignore=all`. To
|
for those submodules where `submodule.<name>.ignore=all`. The only
|
||||||
|
exception to that rule is that status and commit will show staged
|
||||||
|
submodule changes. To
|
||||||
also view the summary for ignored submodules you can either use
|
also view the summary for ignored submodules you can either use
|
||||||
the --ignore-submodules=dirty command-line option or the 'git
|
the --ignore-submodules=dirty command-line option or the 'git
|
||||||
submodule summary' command, which shows a similar output but does
|
submodule summary' command, which shows a similar output but does
|
||||||
@ -2332,7 +2334,9 @@ submodule.<name>.fetchRecurseSubmodules::
|
|||||||
submodule.<name>.ignore::
|
submodule.<name>.ignore::
|
||||||
Defines under what circumstances "git status" and the diff family show
|
Defines under what circumstances "git status" and the diff family show
|
||||||
a submodule as modified. When set to "all", it will never be considered
|
a submodule as modified. When set to "all", it will never be considered
|
||||||
modified, "dirty" will ignore all changes to the submodules work tree and
|
modified (but it will nonetheless show up in the output of status and
|
||||||
|
commit when it has been staged), "dirty" will ignore all changes
|
||||||
|
to the submodules work tree and
|
||||||
takes only differences between the HEAD of the submodule and the commit
|
takes only differences between the HEAD of the submodule and the commit
|
||||||
recorded in the superproject into account. "untracked" will additionally
|
recorded in the superproject into account. "untracked" will additionally
|
||||||
let submodules with modified tracked files in their work tree show up.
|
let submodules with modified tracked files in their work tree show up.
|
||||||
|
@ -67,7 +67,9 @@ submodule.<name>.fetchRecurseSubmodules::
|
|||||||
submodule.<name>.ignore::
|
submodule.<name>.ignore::
|
||||||
Defines under what circumstances "git status" and the diff family show
|
Defines under what circumstances "git status" and the diff family show
|
||||||
a submodule as modified. When set to "all", it will never be considered
|
a submodule as modified. When set to "all", it will never be considered
|
||||||
modified, "dirty" will ignore all changes to the submodules work tree and
|
modified (but will nonetheless show up in the output of status and
|
||||||
|
commit when it has been staged), "dirty" will ignore all changes
|
||||||
|
to the submodules work tree and
|
||||||
takes only differences between the HEAD of the submodule and the commit
|
takes only differences between the HEAD of the submodule and the commit
|
||||||
recorded in the superproject into account. "untracked" will additionally
|
recorded in the superproject into account. "untracked" will additionally
|
||||||
let submodules with modified tracked files in their work tree show up.
|
let submodules with modified tracked files in their work tree show up.
|
||||||
|
@ -898,8 +898,22 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
|
|||||||
|
|
||||||
if (get_sha1(parent, sha1))
|
if (get_sha1(parent, sha1))
|
||||||
commitable = !!active_nr;
|
commitable = !!active_nr;
|
||||||
else
|
else {
|
||||||
commitable = index_differs_from(parent, 0);
|
/*
|
||||||
|
* Unless the user did explicitly request a submodule
|
||||||
|
* ignore mode by passing a command line option we do
|
||||||
|
* not ignore any changed submodule SHA-1s when
|
||||||
|
* comparing index and parent, no matter what is
|
||||||
|
* configured. Otherwise we won't commit any
|
||||||
|
* submodules which were manually staged, which would
|
||||||
|
* be really confusing.
|
||||||
|
*/
|
||||||
|
int diff_flags = DIFF_OPT_OVERRIDE_SUBMODULE_CONFIG;
|
||||||
|
if (ignore_submodule_arg &&
|
||||||
|
!strcmp(ignore_submodule_arg, "all"))
|
||||||
|
diff_flags |= DIFF_OPT_IGNORE_SUBMODULES;
|
||||||
|
commitable = index_differs_from(parent, diff_flags);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
strbuf_release(&committer_ident);
|
strbuf_release(&committer_ident);
|
||||||
|
|
||||||
|
@ -1379,7 +1379,32 @@ EOF
|
|||||||
test_i18ncmp expect output
|
test_i18ncmp expect output
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success '.gitmodules ignore=all suppresses submodule summary' '
|
test_expect_success '.gitmodules ignore=all suppresses unstaged submodule summary' '
|
||||||
|
cat > expect << EOF &&
|
||||||
|
On branch master
|
||||||
|
Changes to be committed:
|
||||||
|
(use "git reset HEAD <file>..." to unstage)
|
||||||
|
|
||||||
|
modified: sm
|
||||||
|
|
||||||
|
Changes not staged for commit:
|
||||||
|
(use "git add <file>..." to update what will be committed)
|
||||||
|
(use "git checkout -- <file>..." to discard changes in working directory)
|
||||||
|
|
||||||
|
modified: dir1/modified
|
||||||
|
|
||||||
|
Untracked files:
|
||||||
|
(use "git add <file>..." to include in what will be committed)
|
||||||
|
|
||||||
|
.gitmodules
|
||||||
|
dir1/untracked
|
||||||
|
dir2/modified
|
||||||
|
dir2/untracked
|
||||||
|
expect
|
||||||
|
output
|
||||||
|
untracked
|
||||||
|
|
||||||
|
EOF
|
||||||
git config --add -f .gitmodules submodule.subname.ignore all &&
|
git config --add -f .gitmodules submodule.subname.ignore all &&
|
||||||
git config --add -f .gitmodules submodule.subname.path sm &&
|
git config --add -f .gitmodules submodule.subname.path sm &&
|
||||||
git status > output &&
|
git status > output &&
|
||||||
@ -1387,7 +1412,7 @@ test_expect_success '.gitmodules ignore=all suppresses submodule summary' '
|
|||||||
git config -f .gitmodules --remove-section submodule.subname
|
git config -f .gitmodules --remove-section submodule.subname
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success '.git/config ignore=all suppresses submodule summary' '
|
test_expect_success '.git/config ignore=all suppresses unstaged submodule summary' '
|
||||||
git config --add -f .gitmodules submodule.subname.ignore none &&
|
git config --add -f .gitmodules submodule.subname.ignore none &&
|
||||||
git config --add -f .gitmodules submodule.subname.path sm &&
|
git config --add -f .gitmodules submodule.subname.path sm &&
|
||||||
git config --add submodule.subname.ignore all &&
|
git config --add submodule.subname.ignore all &&
|
||||||
@ -1460,4 +1485,49 @@ test_expect_success 'Restore default test environment' '
|
|||||||
git config --unset status.showUntrackedFiles
|
git config --unset status.showUntrackedFiles
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'git commit will commit a staged but ignored submodule' '
|
||||||
|
git config --add -f .gitmodules submodule.subname.ignore all &&
|
||||||
|
git config --add -f .gitmodules submodule.subname.path sm &&
|
||||||
|
git config --add submodule.subname.ignore all &&
|
||||||
|
git status -s --ignore-submodules=dirty >output &&
|
||||||
|
test_i18ngrep "^M. sm" output &&
|
||||||
|
GIT_EDITOR="echo hello >>\"\$1\"" &&
|
||||||
|
export GIT_EDITOR &&
|
||||||
|
git commit -uno &&
|
||||||
|
git status -s --ignore-submodules=dirty >output &&
|
||||||
|
test_i18ngrep ! "^M. sm" output
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'git commit --dry-run will show a staged but ignored submodule' '
|
||||||
|
git reset HEAD^ &&
|
||||||
|
git add sm &&
|
||||||
|
cat >expect << EOF &&
|
||||||
|
On branch master
|
||||||
|
Changes to be committed:
|
||||||
|
(use "git reset HEAD <file>..." to unstage)
|
||||||
|
|
||||||
|
modified: sm
|
||||||
|
|
||||||
|
Changes not staged for commit:
|
||||||
|
(use "git add <file>..." to update what will be committed)
|
||||||
|
(use "git checkout -- <file>..." to discard changes in working directory)
|
||||||
|
|
||||||
|
modified: dir1/modified
|
||||||
|
|
||||||
|
Untracked files not listed (use -u option to show untracked files)
|
||||||
|
EOF
|
||||||
|
git commit -uno --dry-run >output &&
|
||||||
|
test_i18ncmp expect output &&
|
||||||
|
git status -s --ignore-submodules=dirty >output &&
|
||||||
|
test_i18ngrep "^M. sm" output
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'git commit -m will commit a staged but ignored submodule' '
|
||||||
|
git commit -uno -m message &&
|
||||||
|
git status -s --ignore-submodules=dirty >output &&
|
||||||
|
test_i18ngrep ! "^M. sm" output &&
|
||||||
|
git config --remove-section submodule.subname &&
|
||||||
|
git config -f .gitmodules --remove-section submodule.subname
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
12
wt-status.c
12
wt-status.c
@ -519,9 +519,19 @@ static void wt_status_collect_changes_index(struct wt_status *s)
|
|||||||
opt.def = s->is_initial ? EMPTY_TREE_SHA1_HEX : s->reference;
|
opt.def = s->is_initial ? EMPTY_TREE_SHA1_HEX : s->reference;
|
||||||
setup_revisions(0, NULL, &rev, &opt);
|
setup_revisions(0, NULL, &rev, &opt);
|
||||||
|
|
||||||
|
DIFF_OPT_SET(&rev.diffopt, OVERRIDE_SUBMODULE_CONFIG);
|
||||||
if (s->ignore_submodule_arg) {
|
if (s->ignore_submodule_arg) {
|
||||||
DIFF_OPT_SET(&rev.diffopt, OVERRIDE_SUBMODULE_CONFIG);
|
|
||||||
handle_ignore_submodules_arg(&rev.diffopt, s->ignore_submodule_arg);
|
handle_ignore_submodules_arg(&rev.diffopt, s->ignore_submodule_arg);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Unless the user did explicitly request a submodule ignore
|
||||||
|
* mode by passing a command line option we do not ignore any
|
||||||
|
* changed submodule SHA-1s when comparing index and HEAD, no
|
||||||
|
* matter what is configured. Otherwise the user won't be
|
||||||
|
* shown any submodules she manually added (and which are
|
||||||
|
* staged to be committed), which would be really confusing.
|
||||||
|
*/
|
||||||
|
handle_ignore_submodules_arg(&rev.diffopt, "dirty");
|
||||||
}
|
}
|
||||||
|
|
||||||
rev.diffopt.output_format |= DIFF_FORMAT_CALLBACK;
|
rev.diffopt.output_format |= DIFF_FORMAT_CALLBACK;
|
||||||
|
Loading…
Reference in New Issue
Block a user