mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
worktree: teach "add" to check out existing branches
Currently 'git worktree add <path>' creates a new branch named after the basename of the path by default. If a branch with that name already exists, the command refuses to do anything, unless the '--force' option is given. However we can do a little better than that, and check the branch out if it is not checked out anywhere else. This will help users who just want to check an existing branch out into a new worktree, and save a few keystrokes. As the current behaviour is to simply 'die()' when a branch with the name of the basename of the path already exists, there are no backwards compatibility worries here. We will still 'die()' if the branch is checked out in another worktree, unless the --force flag is passed. Helped-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com> Reviewed-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
6427f87186
commit
f60a7b763f
|
@ -61,8 +61,13 @@ $ git worktree add --track -b <branch> <path> <remote>/<branch>
|
||||||
------------
|
------------
|
||||||
+
|
+
|
||||||
If `<commit-ish>` is omitted and neither `-b` nor `-B` nor `--detach` used,
|
If `<commit-ish>` is omitted and neither `-b` nor `-B` nor `--detach` used,
|
||||||
then, as a convenience, a new branch based at HEAD is created automatically,
|
then, as a convenience, the new worktree is associated with a branch
|
||||||
as if `-b $(basename <path>)` was specified.
|
(call it `<branch>`) named after `$(basename <path>)`. If `<branch>`
|
||||||
|
doesn't exist, a new branch based on HEAD is automatically created as
|
||||||
|
if `-b <branch>` was given. If `<branch>` does exist, it will be
|
||||||
|
checked out in the new worktree, if it's not checked out anywhere
|
||||||
|
else, otherwise the command will refuse to create the worktree (unless
|
||||||
|
`--force` is used).
|
||||||
|
|
||||||
list::
|
list::
|
||||||
|
|
||||||
|
|
|
@ -391,8 +391,17 @@ static const char *dwim_branch(const char *path, const char **new_branch)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
const char *s = worktree_basename(path, &n);
|
const char *s = worktree_basename(path, &n);
|
||||||
*new_branch = xstrndup(s, n);
|
const char *branchname = xstrndup(s, n);
|
||||||
UNLEAK(*new_branch);
|
struct strbuf ref = STRBUF_INIT;
|
||||||
|
|
||||||
|
UNLEAK(branchname);
|
||||||
|
if (!strbuf_check_branch_ref(&ref, branchname) &&
|
||||||
|
ref_exists(ref.buf)) {
|
||||||
|
strbuf_release(&ref);
|
||||||
|
return branchname;
|
||||||
|
}
|
||||||
|
|
||||||
|
*new_branch = branchname;
|
||||||
if (guess_remote) {
|
if (guess_remote) {
|
||||||
struct object_id oid;
|
struct object_id oid;
|
||||||
const char *remote =
|
const char *remote =
|
||||||
|
|
|
@ -198,13 +198,25 @@ test_expect_success '"add" with <branch> omitted' '
|
||||||
test_cmp_rev HEAD bat
|
test_cmp_rev HEAD bat
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success '"add" auto-vivify does not clobber existing branch' '
|
test_expect_success '"add" checks out existing branch of dwimd name' '
|
||||||
test_commit c1 &&
|
git branch dwim HEAD~1 &&
|
||||||
test_commit c2 &&
|
git worktree add dwim &&
|
||||||
git branch precious HEAD~1 &&
|
test_cmp_rev HEAD~1 dwim &&
|
||||||
test_must_fail git worktree add precious &&
|
(
|
||||||
test_cmp_rev HEAD~1 precious &&
|
cd dwim &&
|
||||||
test_path_is_missing precious
|
test_cmp_rev HEAD dwim
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success '"add <path>" dwim fails with checked out branch' '
|
||||||
|
git checkout -b test-branch &&
|
||||||
|
test_must_fail git worktree add test-branch &&
|
||||||
|
test_path_is_missing test-branch
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success '"add --force" with existing dwimd name doesnt die' '
|
||||||
|
git checkout test-branch &&
|
||||||
|
git worktree add --force test-branch
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success '"add" no auto-vivify with --detach and <branch> omitted' '
|
test_expect_success '"add" no auto-vivify with --detach and <branch> omitted' '
|
||||||
|
|
Loading…
Reference in a new issue