push: fail early with detached HEAD and current

Setting push.default to current adds the refspec "HEAD" for the transport layer to handle. If "HEAD" doesn't resolve to a branch (and since no refspec rhs is specified), the push fails after some time with a cryptic error message: $ git push error: unable to push to unqualified destination: HEAD The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'git@github.com:artagnon/git' Fail early with a nicer error message: $ git push fatal: You are not currently on a branch. To push the history leading to the current (detached HEAD) state now, use git push ram HEAD:<name-of-remote-branch> Just like in the upstream and simple cases. Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Ramkumar Ramachandra committed May 30, 2013 at 00:51 UTC 7b2ecd81084adeba701c60da81eec6be478910b8
1 file changed +5
builtin/push.c
+5
@@ -175,6 +175,8 @@ static void warn_unspecified_push_default_configuration(void)
175
176 static void setup_default_push_refspecs(struct remote *remote)
177 {
178 + struct branch *branch;
179 +
180 switch (push_default) {
181 default:
182 case PUSH_DEFAULT_UNSPECIFIED:
@@ -194,6 +196,9 @@ static void setup_default_push_refspecs(struct remote *remote)
196 break;
197
198 case PUSH_DEFAULT_CURRENT:
199 + branch = branch_get(NULL);
200 + if (!branch)
201 + die(_(message_detached_head_die), remote->name);
202 add_refspec("HEAD");
203 break;
204