mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
As the "checkout" documentation describes:
If <branch> is not found but there does exist a tracking branch in
exactly one remote (call it <remote>) with a matching name, treat
as equivalent to [...] <remote>/<branch.
This is a really useful feature. The problem is that when you add
another remote (e.g. a fork), git won't find a unique branch name
anymore, and will instead print this unhelpful message:
$ git checkout master
error: pathspec 'master' did not match any file(s) known to git
Now it will, on my git.git checkout, print:
$ ./git --exec-path=$PWD checkout master
error: pathspec 'master' did not match any file(s) known to git.
hint: 'master' matched more than one remote tracking branch.
hint: We found 26 remotes with a reference that matched. So we fell back
hint: on trying to resolve the argument as a path, but failed there too!
hint:
hint: If you meant to check out a remote tracking branch on, e.g. 'origin',
hint: you can do so by fully qualifying the name with the --track option:
hint:
hint: git checkout --track origin/<name>
Note that the "error: pathspec[...]" message is still printed. This is
because whatever else checkout may have tried earlier, its final
fallback is to try to resolve the argument as a path. E.g. in this
case:
$ ./git --exec-path=$PWD checkout master pu
error: pathspec 'master' did not match any file(s) known to git.
error: pathspec 'pu' did not match any file(s) known to git.
There we don't print the "hint:" implicitly due to earlier logic
around the DWIM fallback. That fallback is only used if it looks like
we have one argument that might be a branch.
I can't think of an intrinsic reason for why we couldn't in some
future change skip printing the "error: pathspec[...]" error. However,
to do so we'd need to pass something down to checkout_paths() to make
it suppress printing an error on its own, and for us to be confident
that we're not silencing cases where those errors are meaningful.
I don't think that's worth it since determining whether that's the
case could easily change due to future changes in the checkout logic.
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
36 lines
1.1 KiB
C
36 lines
1.1 KiB
C
#ifndef ADVICE_H
|
|
#define ADVICE_H
|
|
|
|
#include "git-compat-util.h"
|
|
|
|
extern int advice_push_update_rejected;
|
|
extern int advice_push_non_ff_current;
|
|
extern int advice_push_non_ff_matching;
|
|
extern int advice_push_already_exists;
|
|
extern int advice_push_fetch_first;
|
|
extern int advice_push_needs_force;
|
|
extern int advice_status_hints;
|
|
extern int advice_status_u_option;
|
|
extern int advice_commit_before_merge;
|
|
extern int advice_resolve_conflict;
|
|
extern int advice_implicit_identity;
|
|
extern int advice_detached_head;
|
|
extern int advice_set_upstream_failure;
|
|
extern int advice_object_name_warning;
|
|
extern int advice_rm_hints;
|
|
extern int advice_add_embedded_repo;
|
|
extern int advice_ignored_hook;
|
|
extern int advice_waiting_for_editor;
|
|
extern int advice_graft_file_deprecated;
|
|
extern int advice_checkout_ambiguous_remote_branch_name;
|
|
|
|
int git_default_advice_config(const char *var, const char *value);
|
|
__attribute__((format (printf, 1, 2)))
|
|
void advise(const char *advice, ...);
|
|
int error_resolve_conflict(const char *me);
|
|
extern void NORETURN die_resolve_conflict(const char *me);
|
|
void NORETURN die_conclude_merge(void);
|
|
void detach_advice(const char *new_name);
|
|
|
|
#endif /* ADVICE_H */
|