Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion builtin/worktree.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,19 @@
"\n" \
" git worktree add --orphan %s\n")

#define WORKTREE_ADD_AMBIGUOUS_REMOTE_BRANCH_NAME_HINT_TEXT \
_("Matched multiple remote tracking branches, you can list them by:\n" \
"\n" \
" git branch -r --list \"*/%s\"\n" \
"\n" \
"If you meant to create a worktree from a remote tracking branch on,\n" \
"e.g. 'origin', you can do so by:\n" \
"\n" \
" git worktree add -b %s %s origin/%s\n" \
"\n" \
"If you'd like to always prefer some remote, e.g. 'origin',\n" \
"consider setting checkout.defaultRemote=origin in your config.")

static const char * const git_worktree_usage[] = {
BUILTIN_WORKTREE_ADD_USAGE,
BUILTIN_WORKTREE_LIST_USAGE,
Expand Down Expand Up @@ -904,10 +917,18 @@ static int add(int ac, const char **av, const char *prefix,

commit = lookup_commit_reference_by_name(branch);
if (!commit) {
remote = unique_tracking_name(branch, &oid, NULL);
int num_matches = 0;
remote = unique_tracking_name(branch, &oid, &num_matches);
if (remote) {
new_branch = branch;
branch = new_branch_to_free = remote;
} else if (num_matches > 1) {
if (!opts.quiet)
advise_if_enabled(ADVICE_CHECKOUT_AMBIGUOUS_REMOTE_BRANCH_NAME,
WORKTREE_ADD_AMBIGUOUS_REMOTE_BRANCH_NAME_HINT_TEXT,
branch, branch, path, branch);
die(_("'%s' matched multiple (%d) remote tracking branches"),
branch, num_matches);
}
}

Expand Down
4 changes: 2 additions & 2 deletions t/t2400-worktree-add.sh
Original file line number Diff line number Diff line change
Expand Up @@ -624,12 +624,12 @@ test_expect_success '"add" <path> <branch> dwims' '
test_expect_success '"add" <path> <branch> dwims with checkout.defaultRemote' '
test_when_finished rm -rf repo_upstream repo_dwim foo &&
setup_remote_repo repo_upstream repo_dwim &&
git init repo_dwim &&
(
cd repo_dwim &&
git remote add repo_upstream2 ../repo_upstream &&
git fetch repo_upstream2 &&
test_must_fail git worktree add ../foo foo &&
test_must_fail git worktree add ../foo foo 2>error.actual &&
test_grep "matched multiple (2) remote tracking branches" error.actual &&
git -c checkout.defaultRemote=repo_upstream worktree add ../foo foo &&
git status -uno --porcelain >status.actual &&
test_must_be_empty status.actual
Expand Down
Loading