[PATCH v2 00/21] Support multiple worktrees
- From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
- Date
- Dec 14, 2013, 10:54 UTC
- Message-ID
- <1387018507-21999-1-git-send-email-pclouds@gmail.com>
- In-Reply-To
- <1386771333-32574-1-git-send-email-pclouds@gmail.com>
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 --allDocumentation/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