-
Notifications
You must be signed in to change notification settings - Fork 141
checkout: die() on ambiguous tracking branches #477
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1113,12 +1113,43 @@ static void setup_new_branch_info_and_source_tree( | |
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. On the Git mailing list, Ævar Arnfjörð Bjarmason wrote (reply to this):
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. On the Git mailing list, Alexandr Miloslavskiy wrote (reply to this):
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. On the Git mailing list, Alexandr Miloslavskiy wrote (reply to this):
|
||
} | ||
|
||
static const char *parse_remote_branch(const char *arg, | ||
struct object_id *rev, | ||
int could_be_checkout_paths) | ||
{ | ||
int num_matches = 0; | ||
const char *remote = unique_tracking_name(arg, rev, &num_matches); | ||
|
||
if (remote && could_be_checkout_paths) { | ||
die(_("'%s' could be both a local file and a tracking branch.\n" | ||
"Please use -- (and optionally --no-guess) to disambiguate"), | ||
arg); | ||
} | ||
|
||
if (!remote && num_matches > 1) { | ||
if (advice_checkout_ambiguous_remote_branch_name) { | ||
advise(_("If you meant to check out a remote tracking branch on, e.g. 'origin',\n" | ||
"you can do so by fully qualifying the name with the --track option:\n" | ||
"\n" | ||
" git checkout --track origin/<name>\n" | ||
"\n" | ||
"If you'd like to always have checkouts of an ambiguous <name> prefer\n" | ||
"one remote, e.g. the 'origin' remote, consider setting\n" | ||
"checkout.defaultRemote=origin in your config.")); | ||
} | ||
|
||
die(_("'%s' matched multiple (%d) remote tracking branches"), | ||
arg, num_matches); | ||
} | ||
|
||
return remote; | ||
} | ||
|
||
static int parse_branchname_arg(int argc, const char **argv, | ||
int dwim_new_local_branch_ok, | ||
struct branch_info *new_branch_info, | ||
struct checkout_opts *opts, | ||
struct object_id *rev, | ||
int *dwim_remotes_matched) | ||
struct object_id *rev) | ||
{ | ||
const char **new_branch = &opts->new_branch; | ||
int argcount = 0; | ||
|
@@ -1223,13 +1254,9 @@ static int parse_branchname_arg(int argc, const char **argv, | |
recover_with_dwim = 0; | ||
|
||
if (recover_with_dwim) { | ||
const char *remote = unique_tracking_name(arg, rev, | ||
dwim_remotes_matched); | ||
const char *remote = parse_remote_branch(arg, rev, | ||
could_be_checkout_paths); | ||
if (remote) { | ||
if (could_be_checkout_paths) | ||
die(_("'%s' could be both a local file and a tracking branch.\n" | ||
"Please use -- (and optionally --no-guess) to disambiguate"), | ||
arg); | ||
*new_branch = arg; | ||
arg = remote; | ||
/* DWIMmed to create local branch, case (3).(b) */ | ||
|
@@ -1492,7 +1519,6 @@ static int checkout_main(int argc, const char **argv, const char *prefix, | |
const char * const usagestr[]) | ||
{ | ||
struct branch_info new_branch_info; | ||
int dwim_remotes_matched = 0; | ||
int parseopt_flags = 0; | ||
|
||
memset(&new_branch_info, 0, sizeof(new_branch_info)); | ||
|
@@ -1600,8 +1626,7 @@ static int checkout_main(int argc, const char **argv, const char *prefix, | |
opts->track == BRANCH_TRACK_UNSPECIFIED && | ||
!opts->new_branch; | ||
int n = parse_branchname_arg(argc, argv, dwim_ok, | ||
&new_branch_info, opts, &rev, | ||
&dwim_remotes_matched); | ||
&new_branch_info, opts, &rev); | ||
argv += n; | ||
argc -= n; | ||
} else if (!opts->accept_ref && opts->from_treeish) { | ||
|
@@ -1659,28 +1684,10 @@ static int checkout_main(int argc, const char **argv, const char *prefix, | |
} | ||
|
||
UNLEAK(opts); | ||
if (opts->patch_mode || opts->pathspec.nr) { | ||
int ret = checkout_paths(opts, new_branch_info.name); | ||
if (ret && dwim_remotes_matched > 1 && | ||
advice_checkout_ambiguous_remote_branch_name) | ||
advise(_("'%s' matched more than one remote tracking branch.\n" | ||
"We found %d remotes with a reference that matched. So we fell back\n" | ||
"on trying to resolve the argument as a path, but failed there too!\n" | ||
"\n" | ||
"If you meant to check out a remote tracking branch on, e.g. 'origin',\n" | ||
"you can do so by fully qualifying the name with the --track option:\n" | ||
"\n" | ||
" git checkout --track origin/<name>\n" | ||
"\n" | ||
"If you'd like to always have checkouts of an ambiguous <name> prefer\n" | ||
"one remote, e.g. the 'origin' remote, consider setting\n" | ||
"checkout.defaultRemote=origin in your config."), | ||
argv[0], | ||
dwim_remotes_matched); | ||
return ret; | ||
} else { | ||
if (opts->patch_mode || opts->pathspec.nr) | ||
return checkout_paths(opts, new_branch_info.name); | ||
else | ||
return checkout_branch(opts, &new_branch_info); | ||
} | ||
} | ||
|
||
int cmd_checkout(int argc, const char **argv, const char *prefix) | ||
|
Uh oh!
There was an error while loading. Please reload this page.