send_pack() sends only those refs we've asked to be updated on the destination---either via an explicit refspec or by matching local and remote refs. But rev_list() builds an object list for *all* refs it can find. For a tree with many tags/heads, this means that it is impossible to push updates even to a single refspec, as exec_rev_list() overflows its arg length limit. Fix this by skipping refs with no peer_ref set in exec_rev_list(). send_pack() already skips it when sending refs; we need to skip it when building the object list for the pack too. Signed-off-by: Stephen Tweedie <sct@xxxxxxxxxx> --- send-pack.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) 4aa39c0920eea37987ca8a6b10861da7a87b5c14 diff --git a/send-pack.c b/send-pack.c index 990be3f..d2a39d9 100644 --- a/send-pack.c +++ b/send-pack.c @@ -42,8 +42,10 @@ static void exec_rev_list(struct ref *re args[i++] = "rev-list"; /* 0 */ args[i++] = "--objects"; /* 1 */ - while (refs) { + for (; refs; refs = refs->next) { char *buf = malloc(100); + if (!refs->peer_ref) + continue; if (i > 900) die("git-rev-list environment overflow"); if (!is_zero_sha1(refs->old_sha1) && @@ -56,7 +58,6 @@ static void exec_rev_list(struct ref *re args[i++] = buf; snprintf(buf, 50, "%s", sha1_to_hex(refs->new_sha1)); } - refs = refs->next; } args[i] = NULL; execv_git_cmd(args); -- 1.2.2.g6643-dirty - : 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