will not update the skip-worktree bit in the index nor add/remove
files in the working directory to reflect the current sparse checkout
settings nor will it show the local changes.
+
+checkout.overlayMode::
+ In the default overlay mode, `git checkout` never
+ removes files from the index or the working tree. When
+ setting `checkout.overlayMode` to false, files that appear in
+ the index and working tree, but not in <tree-ish> are removed,
+ to make them match <tree-ish> exactly.
static int git_checkout_config(const char *var, const char *value, void *cb)
{
+ struct checkout_opts *opts = cb;
+
if (!strcmp(var, "checkout.optimizenewbranch")) {
checkout_optimize_new_branch = git_config_bool(var, value);
return 0;
}
+ if (!strcmp(var, "checkout.overlaymode")) {
+ opts->overlay_mode = git_config_bool(var, value);
+ return 0;
+ }
+
if (!strcmp(var, "diff.ignoresubmodules")) {
- struct checkout_opts *opts = cb;
handle_ignore_submodules_arg(&opts->diff_options, value);
return 0;
}
test_path_is_missing file1
'
+test_expect_success 'checkout with checkout.overlayMode=false deletes files not in <tree-ish>' '
+ >file &&
+ mkdir dir &&
+ >dir/file1 &&
+ git add file dir/file1 &&
+ git -c checkout.overlayMode=false checkout HEAD -- file &&
+ test_path_is_missing file &&
+ test_path_is_file dir/file1
+'
+
test_done