- /*
- * See if we have any refs that the other end didn't have
- */
- if (nr_match) {
- local_ref_nr_match = nr_match;
- local_ref_match = match;
- local_ref_list = ref_list;
- local_last_ref = last_ref;
- for_each_ref(try_to_match);
- }
-
- /*
- * Finally, tell the other end!
- */
- new_refs = 0;
- for (ref = ref_list; ref; ref = ref->next) {
- char old_hex[60], *new_hex;
- if (is_zero_sha1(ref->new_sha1))
+ if (!force_update && !is_zero_sha1(ref->old_sha1)) {
+ if (!has_sha1_file(ref->old_sha1)) {
+ error("remote '%s' object %s does not "
+ "exist on local",
+ ref->name, sha1_to_hex(ref->old_sha1));
+ continue;
+ }
+ /* We assume that local is fsck-clean. Otherwise
+ * you _could_ have a old tag which points at
+ * something you do not have which may or may not
+ * be a commit.
+ */
+ if (!ref_newer(ref->peer_ref->new_sha1,
+ ref->old_sha1)) {
+ error("remote ref '%s' is not a strict "
+ "subset of local ref '%s'.", ref->name,
+ ref->peer_ref->name);
+ continue;
+ }
+ }
+ memcpy(ref->new_sha1, ref->peer_ref->new_sha1, 20);
+ if (is_zero_sha1(ref->new_sha1)) {
+ error("cannot happen anymore");