git_path(): keep "info/sparse-checkout" per work-tree
Currently git_path("info/sparse-checkout") resolves to $GIT_COMMON_DIR/info/sparse-checkout in multiple worktree mode. It makes more sense for the sparse checkout patterns to be per worktree, so you can have multiple checkouts with different parts of the tree. With this, "git checkout --to <new>" on a sparse checkout will create <new> as a full checkout. Which is expected, it's how a new checkout is made. The user can reshape the worktree afterwards. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Nguyễn Thái Ngọc Duy committed
Nov 30, 2014 at 15:24 UTC
6cfbdcb2ab70b238fca9b3811f5b58368fd077c6
2 files changed
+3
-1
path.c
+2
-1
@@ -103,7 +103,8 @@ static void update_common_dir(struct strbuf *buf, int git_dir_len)
103
char *base = buf->buf + git_dir_len;
104
const char **p;
105
106
- if (is_dir_file(base, "logs", "HEAD"))
106
+ if (is_dir_file(base, "logs", "HEAD") ||
107
+ is_dir_file(base, "info", "sparse-checkout"))
108
return; /* keep this in $GIT_DIR */
109
for (p = common_list; *p; p++) {
110
const char *path = *p;
t/t0060-path-utils.sh
+1
@@ -270,6 +270,7 @@ test_git_path GIT_COMMON_DIR=bar objects bar/objects
270
test_git_path GIT_COMMON_DIR=bar objects/bar bar/objects/bar
271
test_git_path GIT_COMMON_DIR=bar info/exclude bar/info/exclude
272
test_git_path GIT_COMMON_DIR=bar info/grafts bar/info/grafts
273
+test_git_path GIT_COMMON_DIR=bar info/sparse-checkout .git/info/sparse-checkout
274
test_git_path GIT_COMMON_DIR=bar remotes/bar bar/remotes/bar
275
test_git_path GIT_COMMON_DIR=bar branches/bar bar/branches/bar
276
test_git_path GIT_COMMON_DIR=bar logs/refs/heads/master bar/logs/refs/heads/master