[PATCH] Don't sent objects for refs we're not going to update.
From: Stephen C. Tweedie <hidden>
Date: 2016-06-15 22:42:19
Subsystem:
the rest · Maintainer:
Linus Torvalds
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 <redacted> --- 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