Skip to content

Commit

Permalink
send-pack: handle partial pushes correctly.
Browse files Browse the repository at this point in the history
When pushing into multi-user repository, or when pushing to a
repository from a local repository that has rebased branches
that has been pruned, the destination repository can have head
commits that are missing from the local repository.

This should not matter as long as the local head of the branch
being pushed is a proper superset of the destination branch, but
we ended up trying to run rev-list telling it to exclude objects
reachable from those heads missing from the local repository,
causing it to barf.  Prune those heads from the rev-list
parameter list, and make sure we do not try to push a branch
whose remote head is something we lack.

Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Junio C Hamano committed Aug 3, 2005
1 parent 5825e5b commit 40b64d4
Showing 1 changed file with 8 additions and 1 deletion.
9 changes: 8 additions & 1 deletion send-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ static void exec_rev_list(struct ref *refs)
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;
Expand Down Expand Up @@ -203,6 +204,12 @@ static int send_pack(int in, int out, int nr_match, char **match)
continue;
}

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;
}

if (!ref_newer(new_sha1, ref->old_sha1)) {
error("remote '%s' isn't a strict parent of local", name);
continue;
Expand Down

0 comments on commit 40b64d4

Please sign in to comment.