Merge branch 'nd/checkout-keep-sparse'

Make the initial "sparse" selection of the paths more sticky across
"git checkout".

* nd/checkout-keep-sparse:
  checkout: add --ignore-skip-worktree-bits in sparse checkout mode
This commit is contained in:
Junio C Hamano 2013-04-22 11:11:40 -07:00
commit de0d774d46
5 changed files with 40 additions and 1 deletions

View file

@ -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,

View file

@ -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',

View file

@ -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,
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)
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 },

View file

@ -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

View file

@ -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
' '