Andy Parkins <andyparkins@xxxxxxxxx> writes: > Hello, > > Just ran this while on a detached HEAD. > > $ git fetch > fatal: ref HEAD is not a symbolic ref > fatal: ref HEAD is not a symbolic ref > fatal: ref HEAD is not a symbolic ref > remote: Generating pack... > ...etc... > > The fetch appears to have succeeded anyway, but it's a scary message that > tells a user something is "fatal". Has this done any damage? I do not think it has done any damage, but that is certainly alarming. This might help (untested, of course). By the way, with or without this patch, there currently is no good way to tell failure modes between "git symbolic-ref HAED" and "git symbolic-ref HEAD". Both says "is not a symbolic ref". We may want to do something about it. --- diff --git a/Documentation/git-symbolic-ref.txt b/Documentation/git-symbolic-ref.txt index 4bc35a1..1e818bb 100644 --- a/Documentation/git-symbolic-ref.txt +++ b/Documentation/git-symbolic-ref.txt @@ -7,7 +7,7 @@ git-symbolic-ref - read and modify symbolic refs SYNOPSIS -------- -'git-symbolic-ref' <name> [<ref>] +'git-symbolic-ref' [-q] <name> [<ref>] DESCRIPTION ----------- @@ -23,6 +23,14 @@ A symbolic ref is a regular file that stores a string that begins with `ref: refs/`. For example, your `.git/HEAD` is a regular file whose contents is `ref: refs/heads/master`. +OPTIONS +------- + +-q:: + Do not issue an error message if the <name> is not a + symbolic ref but a detached HEAD; instead exit with + non-zero status silently. + NOTES ----- In the past, `.git/HEAD` was a symbolic link pointing at diff --git a/builtin-symbolic-ref.c b/builtin-symbolic-ref.c index d8be052..227c9d4 100644 --- a/builtin-symbolic-ref.c +++ b/builtin-symbolic-ref.c @@ -3,9 +3,9 @@ #include "refs.h" static const char git_symbolic_ref_usage[] = -"git-symbolic-ref name [ref]"; +"git-symbolic-ref [-q] name [ref]"; -static void check_symref(const char *HEAD) +static void check_symref(const char *HEAD, int quiet) { unsigned char sha1[20]; int flag; @@ -13,17 +13,41 @@ static void check_symref(const char *HEAD) if (!refs_heads_master) die("No such ref: %s", HEAD); - else if (!(flag & REF_ISSYMREF)) - die("ref %s is not a symbolic ref", HEAD); + else if (!(flag & REF_ISSYMREF)) { + if (!quiet) + die("ref %s is not a symbolic ref", HEAD); + else + exit(1); + } puts(refs_heads_master); } int cmd_symbolic_ref(int argc, const char **argv, const char *prefix) { + int quiet = 0; + git_config(git_default_config); + + while (1 < argc) { + const char *arg = argv[1]; + if (arg[0] != '-') + break; + else if (!strcmp("-q", arg)) + quiet = 1; + else if (!strcmp("--", arg)) { + argc--; + argv++; + break; + } + else + die("unknown option %s", arg); + argc--; + argv++; + } + switch (argc) { case 2: - check_symref(argv[1]); + check_symref(argv[1], quiet); break; case 3: create_symref(argv[1], argv[2]); diff --git a/git-parse-remote.sh b/git-parse-remote.sh index d2e4c2b..4fc6020 100755 --- a/git-parse-remote.sh +++ b/git-parse-remote.sh @@ -49,7 +49,7 @@ get_remote_url () { } get_default_remote () { - curr_branch=$(git-symbolic-ref HEAD | sed -e 's|^refs/heads/||') + curr_branch=$(git-symbolic-ref -q HEAD | sed -e 's|^refs/heads/||') origin=$(git-repo-config --get "branch.$curr_branch.remote") echo ${origin:-origin} } @@ -137,7 +137,7 @@ canon_refs_list_for_fetch () { shift if test "$remote" = "$(get_default_remote)" then - curr_branch=$(git-symbolic-ref HEAD | \ + curr_branch=$(git-symbolic-ref -q HEAD | \ sed -e 's|^refs/heads/||') merge_branches=$(git-repo-config \ --get-all "branch.${curr_branch}.merge") - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html