It turns out that .git/branches/foo should fetch into refs/heads/foo. Signed-off-by: Daniel Barkalow <barkalow@xxxxxxxxxxxx> --- We still don't have a test for that bit of the behavior, so I could have it still doing the wrong thing. But it at least should do what I think people want. Andrew, could you give this a try, on top of current master (or, for that matter, any released version that doesn't work), and let me know if it does the wrong thing? remote.c | 15 +++++++-------- 1 files changed, 7 insertions(+), 8 deletions(-) diff --git a/remote.c b/remote.c index 40ed246..a027bca 100644 --- a/remote.c +++ b/remote.c @@ -232,7 +232,7 @@ static void read_branches_file(struct remote *remote) { const char *slash = strchr(remote->name, '/'); char *frag; - char *branch; + struct strbuf branch; int n = slash ? slash - remote->name : 1000; FILE *f = fopen(git_path("branches/%.*s", n, remote->name), "r"); char *s, *p; @@ -258,17 +258,16 @@ static void read_branches_file(struct remote *remote) strcpy(p, s); if (slash) strcat(p, slash); + strbuf_init(&branch, 0); frag = strchr(p, '#'); if (frag) { *(frag++) = '\0'; - branch = xmalloc(strlen(frag) + 12); - strcpy(branch, "refs/heads/"); - strcat(branch, frag); - } else { - branch = "refs/heads/master"; - } + strbuf_addf(&branch, "refs/heads/%s", frag); + } else + strbuf_addstr(&branch, "refs/heads/master"); add_url_alias(remote, p); - add_fetch_refspec(remote, branch); + strbuf_addf(&branch, ":refs/heads/%s", remote->name); + add_fetch_refspec(remote, strbuf_detach(&branch, 0)); remote->fetch_tags = 1; /* always auto-follow */ } -- 1.5.4.3.610.gea6cd -- 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