зеркало из https://github.com/microsoft/git.git
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:
Коммит
6d681f0a3e
|
@ -2301,7 +2301,9 @@ status.submodulesummary::
|
|||
--summary-limit option of linkgit:git-submodule[1]). Please note
|
||||
that the summary output command will be suppressed for all
|
||||
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
|
||||
the --ignore-submodules=dirty command-line option or the 'git
|
||||
submodule summary' command, which shows a similar output but does
|
||||
|
@ -2332,7 +2334,9 @@ submodule.<name>.fetchRecurseSubmodules::
|
|||
submodule.<name>.ignore::
|
||||
Defines under what circumstances "git status" and the diff family show
|
||||
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
|
||||
recorded in the superproject into account. "untracked" will additionally
|
||||
let submodules with modified tracked files in their work tree show up.
|
||||
|
|
|
@ -67,7 +67,9 @@ submodule.<name>.fetchRecurseSubmodules::
|
|||
submodule.<name>.ignore::
|
||||
Defines under what circumstances "git status" and the diff family show
|
||||
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
|
||||
recorded in the superproject into account. "untracked" will additionally
|
||||
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))
|
||||
commitable = !!active_nr;
|
||||
else
|
||||
commitable = index_differs_from(parent, 0);
|
||||
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 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);
|
||||
|
||||
|
|
|
@ -1379,7 +1379,32 @@ EOF
|
|||
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.path sm &&
|
||||
git status > output &&
|
||||
|
@ -1387,7 +1412,7 @@ test_expect_success '.gitmodules ignore=all suppresses submodule summary' '
|
|||
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.path sm &&
|
||||
git config --add submodule.subname.ignore all &&
|
||||
|
@ -1460,4 +1485,49 @@ test_expect_success 'Restore default test environment' '
|
|||
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
|
||||
|
|
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;
|
||||
setup_revisions(0, NULL, &rev, &opt);
|
||||
|
||||
DIFF_OPT_SET(&rev.diffopt, OVERRIDE_SUBMODULE_CONFIG);
|
||||
if (s->ignore_submodule_arg) {
|
||||
DIFF_OPT_SET(&rev.diffopt, OVERRIDE_SUBMODULE_CONFIG);
|
||||
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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче