aboutsummaryrefslogtreecommitdiffstats
path: root/builtin
diff options
context:
space:
mode:
Diffstat (limited to 'builtin')
-rw-r--r--builtin/fetch.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/builtin/fetch.c b/builtin/fetch.c
index b2a36a5d95..a64de4485f 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -1584,7 +1584,7 @@ static const char *strip_refshead(const char *name){
static int set_head(const struct ref *remote_refs)
{
- int result = 0;
+ int result = 0, is_bare;
struct strbuf b_head = STRBUF_INIT, b_remote_head = STRBUF_INIT;
const char *remote = gtransport->remote->name;
char *head_name = NULL;
@@ -1616,15 +1616,21 @@ static int set_head(const struct ref *remote_refs)
if (!head_name)
goto cleanup;
- strbuf_addf(&b_head, "refs/remotes/%s/HEAD", remote);
- strbuf_addf(&b_remote_head, "refs/remotes/%s/%s", remote, head_name);
+ is_bare = is_bare_repository();
+ if (is_bare) {
+ strbuf_addstr(&b_head, "HEAD");
+ strbuf_addf(&b_remote_head, "refs/heads/%s", head_name);
+ } else {
+ strbuf_addf(&b_head, "refs/remotes/%s/HEAD", remote);
+ strbuf_addf(&b_remote_head, "refs/remotes/%s/%s", remote, head_name);
+ }
/* make sure it's valid */
- if (!refs_ref_exists(refs, b_remote_head.buf)) {
+ if (!is_bare && !refs_ref_exists(refs, b_remote_head.buf)) {
result = 1;
goto cleanup;
}
if (refs_update_symref_extended(refs, b_head.buf, b_remote_head.buf,
- "fetch", NULL, 1))
+ "fetch", NULL, !is_bare))
result = 1;
cleanup: