This patch seems to fix the problem.

 * If the original value of remote ref refers to an object we do
   not have, and if the ref is one of the branches we are trying
   to push, we refuse to update it.

 * Otherwise, we do not attempt to use such an value when
   computing what objects to put in pack, since rev-list would

I've tested Josef's two-branches case, one repo updates one
branch and pushes to the central repo, another repo updates the
other branch and pushed to the central repo.  The old code
barfed when invoking rev-list, but this does not seem to.

Josef, could you give it a try please?

cd /opt/packrat/playpen/public/in-place/git/git.junio/
# - master: git-send-email-script: minimum whitespace cleanup.
# + (working tree)
diff --git a/send-pack.c b/send-pack.c
--- a/send-pack.c
+++ b/send-pack.c
@@ -43,7 +43,8 @@ static void exec_rev_list(struct ref *re
                char *buf = malloc(100);
                if (i > 900)
                        die("git-rev-list environment overflow");
-               if (!is_zero_sha1(refs->old_sha1)) {
+               if (!is_zero_sha1(refs->old_sha1) &&
+                   has_sha1_file(refs->old_sha1)) {
                        args[i++] = buf;
                        snprintf(buf, 50, "^%s", sha1_to_hex(refs->old_sha1));
                        buf += 50;
@@ -208,6 +209,12 @@ static int send_pack(int in, int out, in
+               if (!has_sha1_file(ref->old_sha1)) {
+                       error("remote '%s' object %s does not exist on local",
+                             name, sha1_to_hex(ref->old_sha1));
+                       continue;
+               }
                /* Ok, mark it for update */
                memcpy(ref->new_sha1, new_sha1, 20);

Compilation finished at Wed Aug  3 11:02:15

To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to