return nl + 1;
 }
 
-static void generate_push_cert(struct strbuf *req_buf,
-                              const struct ref *remote_refs,
-                              struct send_pack_args *args)
+static int generate_push_cert(struct strbuf *req_buf,
+                             const struct ref *remote_refs,
+                             struct send_pack_args *args,
+                             const char *cap_string)
 {
        const struct ref *ref;
        char stamp[60];
        if (sign_buffer(&cert, &cert, signing_key))
                die(_("failed to sign the push certificate"));
 
-       packet_buf_write(req_buf, "push-cert\n");
+       packet_buf_write(req_buf, "push-cert%c%s", 0, cap_string);
        for (cp = cert.buf; cp < cert.buf + cert.len; cp = np) {
                np = next_line(cp, cert.buf + cert.len - cp);
                packet_buf_write(req_buf,
 free_return:
        free(signing_key);
        strbuf_release(&cert);
+       return update_seen;
 }
 
 int send_pack(struct send_pack_args *args,
                advertise_shallow_grafts_buf(&req_buf);
 
        if (!args->dry_run && args->push_cert)
-               generate_push_cert(&req_buf, remote_refs, args);
+               cmds_sent = generate_push_cert(&req_buf, remote_refs, args,
+                                              cap_buf.buf);
 
        /*
         * Clear the status for each ref and see if we need to send
 
        test_i18ngrep "the receiving end does not support" err
 '
 
+test_expect_success GPG 'no certificate for a signed push with no update' '
+       prepare_dst &&
+       mkdir -p dst/.git/hooks &&
+       write_script dst/.git/hooks/post-receive <<-\EOF &&
+       if test -n "${GIT_PUSH_CERT-}"
+       then
+               git cat-file blob $GIT_PUSH_CERT >../push-cert
+       fi
+       EOF
+       git push dst noop &&
+       ! test -f dst/push-cert
+'
+
 test_expect_success GPG 'signed push sends push certificate' '
        prepare_dst &&
        mkdir -p dst/.git/hooks &&