+ strcpy(rev_command, "git-rev-list $(git-rev-parse --all)");
+ rev_command_len = strlen(rev_command);
+ fetching = 0;
+ for ( ; refs ; refs = refs->next) {
+ unsigned char *remote = refs->old_sha1;
+ struct object *o;
+
+ /*
+ * If that object is complete (i.e. it is an ancestor of a
+ * local ref), we tell them we have it but do not have to
+ * tell them about its ancestors, which they already know
+ * about.
+ *
+ * We use lookup_object here because we are only
+ * interested in the case we *know* the object is
+ * reachable and we have already scanned it.
+ */
+ if (((o = lookup_object(remote)) != NULL) &&
+ (o->flags & COMPLETE)) {
+ struct commit_list *p;
+ struct commit *commit =
+ (struct commit *) (o = deref_tag(o));
+ if (!o)
+ goto repair;
+ if (o->type != commit_type)
+ continue;
+ p = commit->parents;
+ while (p &&
+ rev_command_len + 44 < sizeof(rev_command)) {
+ snprintf(rev_command + rev_command_len, 44,
+ " ^%s",
+ sha1_to_hex(p->item->object.sha1));
+ rev_command_len += 43;
+ p = p->next;
+ }
+ continue;
+ }
+ repair:
+ packet_write(fd[1], "want %s\n", sha1_to_hex(remote));
+ fetching++;
+ }
+ packet_flush(fd[1]);
+ if (!fetching)
+ return 1;
+
+ revs = popen(rev_command, "r");