The UI and behavior are taking shape now. On the UI side, you do git checkout --to /somewhere -b newbranch origin/master which will create worktree-only repo at /somewhere. "git prune --repos" could be used to remove cruft in .git/repos. On the behavior side, you should be able to do everything in /somewhere just like in a normal repository. If a ref is updated (from any repository) that also happens to be your HEAD, it will be detached. "git rev-list --all" is also taught to take repos/.../HEAD into account. The structure of repos/XXX is documented in 17/21. Known issues - naming ($GIT_SUPER_DIR, the name of the shared repo and the dependent one, the reuse of "gitdir" in .git files) - gc --auto support, support for manually pruning .git/repos - should probably support the new .git format in enter_repo() so that we can push to it - not sure if we need UI for deleting repositories created with checkout --to, or just "rm -r" and let "gc --auto" clean things up. The thing about "rm -r(f)" is that if .git happens to be a real repo, the user is screwed so I don't really like to encourage doing it. - more tests Nguyễn Thái Ngọc Duy (21): path.c: avoid PATH_MAX as buffer size from get_pathname() path.c: rename vsnpath() to git_vsnpath() path.c: move git_path() closer to similar functions git_pathdup() Make git_path() aware of file relocation in $GIT_DIR reflog: use avoid constructing .lock path with git_path fast-import: use git_path() for accessing .git dir instead of get_git_dir() Add new environment variable $GIT_SUPER_DIR setup.c: refactor path manipulation out of read_gitfile() setup.c: add split-repo support to .git files setup.c: add split-repo support to is_git_directory() setup.c: reduce cleanup sites in setup_explicit_git_dir() environment.c: support super .git file specified by $GIT_DIR setup: support $GIT_SUPER_DIR as well as super .git files checkout: support checking out into a new working directory checkout: clean up half-prepared directories in --to mode setup.c: keep track of the .git file location if read prune: strategies for split repositories refs: adjust reflog path for repos/<id>/HEAD refs: detach split repos' HEAD when the linked ref is updated/deleted refs.c: refactor do_head_ref(... to do_one_ref("HEAD", ... revision: include repos/../HEAD in --all Documentation/config.txt | 3 +- Documentation/git-checkout.txt | 6 + Documentation/git-prune.txt | 4 + Documentation/git.txt | 8 ++ Documentation/gitrepository-layout.txt | 30 ++++ builtin/checkout.c | 173 ++++++++++++++++++++++ builtin/prune.c | 65 +++++++++ builtin/reflog.c | 2 +- builtin/rev-parse.c | 6 + cache.h | 5 + environment.c | 37 ++++- fast-import.c | 5 +- path.c | 140 ++++++++++++++---- refs.c | 88 ++++++++++-- refs.h | 1 + revision.c | 1 + setup.c | 253 ++++++++++++++++++++++++--------- t/t0060-path-utils.sh | 133 +++++++++++++++++ t/t1501-worktree.sh | 52 +++++++ t/t1510-repo-setup.sh | 1 + test-path-utils.c | 7 + trace.c | 1 + 22 files changed, 904 insertions(+), 117 deletions(-) -- 1.8.5.1.77.g42c48fa -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html