提交 08d595dc 编写于 作者: N Nguyễn Thái Ngọc Duy 提交者: Junio C Hamano

checkout: add --ignore-skip-worktree-bits in sparse checkout mode

"git checkout -- <paths>" is usually used to restore all modified
files in <paths>. In sparse checkout mode, this command is overloaded
with another meaning: to add back all files in <paths> that are
excluded by sparse patterns.

As the former makes more sense for day-to-day use. Switch it to the
default and the latter enabled with --ignore-skip-worktree-bits.

While at there, add info/sparse-checkout to gitrepository-layout.txt
Signed-off-by: NNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: NJunio C Hamano <gitster@pobox.com>
上级 85e7e81c
...@@ -180,6 +180,12 @@ branch by running "git rm -rf ." from the top level of the working tree. ...@@ -180,6 +180,12 @@ branch by running "git rm -rf ." from the top level of the working tree.
Afterwards you will be ready to prepare your new files, repopulating the Afterwards you will be ready to prepare your new files, repopulating the
working tree, by copying them from elsewhere, extracting a tarball, etc. working tree, by copying them from elsewhere, extracting a tarball, etc.
--ignore-skip-worktree-bits::
In sparse checkout mode, `git checkout -- <paths>` would
update only entries matched by <paths> and sparse patterns
in $GIT_DIR/info/sparse-checkout. This option ignores
the sparse patterns and adds back any files in <paths>.
-m:: -m::
--merge:: --merge::
When switching branches, When switching branches,
......
...@@ -184,6 +184,10 @@ info/exclude:: ...@@ -184,6 +184,10 @@ info/exclude::
'git clean' look at it but the core Git commands do not look 'git clean' look at it but the core Git commands do not look
at it. See also: linkgit:gitignore[5]. at it. See also: linkgit:gitignore[5].
info/sparse-checkout::
This file stores sparse checkout patterns.
See also: linkgit:git-read-tree[1].
remotes:: remotes::
Stores shorthands for URL and default refnames for use Stores shorthands for URL and default refnames for use
when interacting with remote repositories via 'git fetch', when interacting with remote repositories via 'git fetch',
......
...@@ -35,6 +35,7 @@ struct checkout_opts { ...@@ -35,6 +35,7 @@ struct checkout_opts {
int force_detach; int force_detach;
int writeout_stage; int writeout_stage;
int overwrite_ignore; int overwrite_ignore;
int ignore_skipworktree;
const char *new_branch; const char *new_branch;
const char *new_branch_force; const char *new_branch_force;
...@@ -278,6 +279,8 @@ static int checkout_paths(const struct checkout_opts *opts, ...@@ -278,6 +279,8 @@ static int checkout_paths(const struct checkout_opts *opts,
for (pos = 0; pos < active_nr; pos++) { for (pos = 0; pos < active_nr; pos++) {
struct cache_entry *ce = active_cache[pos]; struct cache_entry *ce = active_cache[pos];
ce->ce_flags &= ~CE_MATCHED; ce->ce_flags &= ~CE_MATCHED;
if (!opts->ignore_skipworktree && ce_skip_worktree(ce))
continue;
if (opts->source_tree && !(ce->ce_flags & CE_UPDATE)) if (opts->source_tree && !(ce->ce_flags & CE_UPDATE))
/* /*
* "git checkout tree-ish -- path", but this entry * "git checkout tree-ish -- path", but this entry
...@@ -1058,6 +1061,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) ...@@ -1058,6 +1061,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
OPT_STRING(0, "conflict", &conflict_style, N_("style"), OPT_STRING(0, "conflict", &conflict_style, N_("style"),
N_("conflict style (merge or diff3)")), N_("conflict style (merge or diff3)")),
OPT_BOOLEAN('p', "patch", &opts.patch_mode, N_("select hunks interactively")), OPT_BOOLEAN('p', "patch", &opts.patch_mode, N_("select hunks interactively")),
OPT_BOOL(0, "ignore-skip-worktree-bits", &opts.ignore_skipworktree,
N_("do not limit pathspecs to sparse entries only")),
{ OPTION_BOOLEAN, 0, "guess", &dwim_new_local_branch, NULL, { OPTION_BOOLEAN, 0, "guess", &dwim_new_local_branch, NULL,
N_("second guess 'git checkout no-such-branch'"), N_("second guess 'git checkout no-such-branch'"),
PARSE_OPT_NOARG | PARSE_OPT_HIDDEN }, PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
......
...@@ -250,4 +250,28 @@ EOF ...@@ -250,4 +250,28 @@ EOF
test_cmp expected actual test_cmp expected actual
' '
test_expect_success 'checkout without --ignore-skip-worktree-bits' '
echo "*" >.git/info/sparse-checkout &&
git checkout -f top &&
test_path_is_file init.t &&
echo sub >.git/info/sparse-checkout &&
git checkout &&
echo modified >> sub/added &&
git checkout . &&
test_path_is_missing init.t &&
git diff --exit-code HEAD
'
test_expect_success 'checkout with --ignore-skip-worktree-bits' '
echo "*" >.git/info/sparse-checkout &&
git checkout -f top &&
test_path_is_file init.t &&
echo sub >.git/info/sparse-checkout &&
git checkout &&
echo modified >> sub/added &&
git checkout --ignore-skip-worktree-bits . &&
test_path_is_file init.t &&
git diff --exit-code HEAD
'
test_done test_done
...@@ -103,7 +103,7 @@ test_expect_success \ ...@@ -103,7 +103,7 @@ test_expect_success \
test_cmp expect output' test_cmp expect output'
test_expect_success 'restore gitignore' ' test_expect_success 'restore gitignore' '
git checkout $allignores && git checkout --ignore-skip-worktree-bits $allignores &&
rm .git/index rm .git/index
' '
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册