diff --git a/builtin/send-pack.c b/builtin/send-pack.c
index 59b626aae8cd8291104d83b5ec201207c97715e8..8d461008e2e860a3de91a69412d66dcbde4d7b96 100644
--- a/builtin/send-pack.c
+++ b/builtin/send-pack.c
@@ -317,7 +317,7 @@ int cmd_send_pack(int argc,
 	set_ref_status_for_push(remote_refs, args.send_mirror,
 		args.force_update);
 
-	ret = send_pack(&args, fd, conn, remote_refs, &extra_have);
+	ret = send_pack(the_repository, &args, fd, conn, remote_refs, &extra_have);
 
 	if (helper_status)
 		print_helper_status(remote_refs);
diff --git a/send-pack.c b/send-pack.c
index 7e8321368379efe2600a1f573e2e4cd5140a008d..772c7683a0157004ede74e56157e3a5d7f082e75 100644
--- a/send-pack.c
+++ b/send-pack.c
@@ -1,5 +1,3 @@
-#define USE_THE_REPOSITORY_VARIABLE
-
 #include "git-compat-util.h"
 #include "config.h"
 #include "commit.h"
@@ -44,10 +42,11 @@ int option_parse_push_signed(const struct option *opt,
 	die("bad %s argument: %s", opt->long_name, arg);
 }
 
-static void feed_object(const struct object_id *oid, FILE *fh, int negative)
+static void feed_object(struct repository *r,
+			const struct object_id *oid, FILE *fh, int negative)
 {
 	if (negative &&
-	    !repo_has_object_file_with_flags(the_repository, oid,
+	    !repo_has_object_file_with_flags(r, oid,
 					     OBJECT_INFO_SKIP_FETCH_OBJECT |
 					     OBJECT_INFO_QUICK))
 		return;
@@ -61,7 +60,8 @@ static void feed_object(const struct object_id *oid, FILE *fh, int negative)
 /*
  * Make a pack stream and spit it out into file descriptor fd
  */
-static int pack_objects(int fd, struct ref *refs, struct oid_array *advertised,
+static int pack_objects(struct repository *r,
+			int fd, struct ref *refs, struct oid_array *advertised,
 			struct oid_array *negotiated,
 			struct send_pack_args *args)
 {
@@ -74,7 +74,7 @@ static int pack_objects(int fd, struct ref *refs, struct oid_array *advertised,
 	FILE *po_in;
 	int rc;
 
-	trace2_region_enter("send_pack", "pack_objects", the_repository);
+	trace2_region_enter("send_pack", "pack_objects", r);
 	strvec_push(&po.args, "pack-objects");
 	strvec_push(&po.args, "--all-progress-implied");
 	strvec_push(&po.args, "--revs");
@@ -87,7 +87,7 @@ static int pack_objects(int fd, struct ref *refs, struct oid_array *advertised,
 		strvec_push(&po.args, "-q");
 	if (args->progress)
 		strvec_push(&po.args, "--progress");
-	if (is_repository_shallow(the_repository))
+	if (is_repository_shallow(r))
 		strvec_push(&po.args, "--shallow");
 	if (args->disable_bitmaps)
 		strvec_push(&po.args, "--no-use-bitmap-index");
@@ -104,15 +104,15 @@ static int pack_objects(int fd, struct ref *refs, struct oid_array *advertised,
 	 */
 	po_in = xfdopen(po.in, "w");
 	for (size_t i = 0; i < advertised->nr; i++)
-		feed_object(&advertised->oid[i], po_in, 1);
+		feed_object(r, &advertised->oid[i], po_in, 1);
 	for (size_t i = 0; i < negotiated->nr; i++)
-		feed_object(&negotiated->oid[i], po_in, 1);
+		feed_object(r, &negotiated->oid[i], po_in, 1);
 
 	while (refs) {
 		if (!is_null_oid(&refs->old_oid))
-			feed_object(&refs->old_oid, po_in, 1);
+			feed_object(r, &refs->old_oid, po_in, 1);
 		if (!is_null_oid(&refs->new_oid))
-			feed_object(&refs->new_oid, po_in, 0);
+			feed_object(r, &refs->new_oid, po_in, 0);
 		refs = refs->next;
 	}
 
@@ -146,10 +146,10 @@ static int pack_objects(int fd, struct ref *refs, struct oid_array *advertised,
 		 */
 		if (rc > 128 && rc != 141)
 			error("pack-objects died of signal %d", rc - 128);
-		trace2_region_leave("send_pack", "pack_objects", the_repository);
+		trace2_region_leave("send_pack", "pack_objects", r);
 		return -1;
 	}
-	trace2_region_leave("send_pack", "pack_objects", the_repository);
+	trace2_region_leave("send_pack", "pack_objects", r);
 	return 0;
 }
 
@@ -164,7 +164,8 @@ static int receive_unpack_status(struct packet_reader *reader)
 	return 0;
 }
 
-static int receive_status(struct packet_reader *reader, struct ref *refs)
+static int receive_status(struct repository *r,
+			  struct packet_reader *reader, struct ref *refs)
 {
 	struct ref *hint;
 	int ret;
@@ -172,7 +173,7 @@ static int receive_status(struct packet_reader *reader, struct ref *refs)
 	int new_report = 0;
 	int once = 0;
 
-	trace2_region_enter("send_pack", "receive_status", the_repository);
+	trace2_region_enter("send_pack", "receive_status", r);
 	hint = NULL;
 	ret = receive_unpack_status(reader);
 	while (1) {
@@ -221,10 +222,10 @@ static int receive_status(struct packet_reader *reader, struct ref *refs)
 			if (!strcmp(key, "refname"))
 				report->ref_name = xstrdup_or_null(val);
 			else if (!strcmp(key, "old-oid") && val &&
-				 !parse_oid_hex(val, &old_oid, &val))
+				 !parse_oid_hex_algop(val, &old_oid, &val, r->hash_algo))
 				report->old_oid = oiddup(&old_oid);
 			else if (!strcmp(key, "new-oid") && val &&
-				 !parse_oid_hex(val, &new_oid, &val))
+				 !parse_oid_hex_algop(val, &new_oid, &val, r->hash_algo))
 				report->new_oid = oiddup(&new_oid);
 			else if (!strcmp(key, "forced-update"))
 				report->forced_update = 1;
@@ -271,7 +272,7 @@ static int receive_status(struct packet_reader *reader, struct ref *refs)
 			new_report = 1;
 		}
 	}
-	trace2_region_leave("send_pack", "receive_status", the_repository);
+	trace2_region_leave("send_pack", "receive_status", r);
 	return ret;
 }
 
@@ -293,9 +294,9 @@ static int advertise_shallow_grafts_cb(const struct commit_graft *graft, void *c
 	return 0;
 }
 
-static void advertise_shallow_grafts_buf(struct strbuf *sb)
+static void advertise_shallow_grafts_buf(struct repository *r, struct strbuf *sb)
 {
-	if (!is_repository_shallow(the_repository))
+	if (!is_repository_shallow(r))
 		return;
 	for_each_commit_graft(advertise_shallow_grafts_cb, sb);
 }
@@ -426,13 +427,14 @@ static void reject_invalid_nonce(const char *nonce, int len)
 	}
 }
 
-static void get_commons_through_negotiation(const char *url,
+static void get_commons_through_negotiation(struct repository *r,
+					    const char *url,
 					    const struct ref *remote_refs,
 					    struct oid_array *commons)
 {
 	struct child_process child = CHILD_PROCESS_INIT;
 	const struct ref *ref;
-	int len = the_hash_algo->hexsz + 1; /* hash + NL */
+	int len = r->hash_algo->hexsz + 1; /* hash + NL */
 	int nr_negotiation_tip = 0;
 
 	child.git_cmd = 1;
@@ -466,7 +468,7 @@ static void get_commons_through_negotiation(const char *url,
 			break;
 		if (read_len != len)
 			die("invalid length read %d", read_len);
-		if (parse_oid_hex(hex_hash, &oid, &end) || *end != '\n')
+		if (parse_oid_hex_algop(hex_hash, &oid, &end, r->hash_algo) || *end != '\n')
 			die("invalid hash");
 		oid_array_append(commons, &oid);
 	} while (1);
@@ -480,7 +482,8 @@ static void get_commons_through_negotiation(const char *url,
 	}
 }
 
-int send_pack(struct send_pack_args *args,
+int send_pack(struct repository *r,
+	      struct send_pack_args *args,
 	      int fd[], struct child_process *conn,
 	      struct ref *remote_refs,
 	      struct oid_array *extra_have)
@@ -518,17 +521,17 @@ int send_pack(struct send_pack_args *args,
 		goto out;
 	}
 
-	git_config_get_bool("push.negotiate", &push_negotiate);
+	repo_config_get_bool(r, "push.negotiate", &push_negotiate);
 	if (push_negotiate) {
-		trace2_region_enter("send_pack", "push_negotiate", the_repository);
-		get_commons_through_negotiation(args->url, remote_refs, &commons);
-		trace2_region_leave("send_pack", "push_negotiate", the_repository);
+		trace2_region_enter("send_pack", "push_negotiate", r);
+		get_commons_through_negotiation(r, args->url, remote_refs, &commons);
+		trace2_region_leave("send_pack", "push_negotiate", r);
 	}
 
-	if (!git_config_get_bool("push.usebitmaps", &use_bitmaps))
+	if (!repo_config_get_bool(r, "push.usebitmaps", &use_bitmaps))
 		args->disable_bitmaps = !use_bitmaps;
 
-	git_config_get_bool("transfer.advertisesid", &advertise_sid);
+	repo_config_get_bool(r, "transfer.advertisesid", &advertise_sid);
 
 	/* Does the other end support the reporting? */
 	if (server_supports("report-status-v2"))
@@ -554,7 +557,7 @@ int send_pack(struct send_pack_args *args,
 	if (server_supports("push-options"))
 		push_options_supported = 1;
 
-	if (!server_supports_hash(the_hash_algo->name, &object_format_supported))
+	if (!server_supports_hash(r->hash_algo->name, &object_format_supported))
 		die(_("the receiving end does not support this repository's hash algorithm"));
 
 	if (args->push_cert != SEND_PACK_PUSH_CERT_NEVER) {
@@ -596,7 +599,7 @@ int send_pack(struct send_pack_args *args,
 	if (use_push_options)
 		strbuf_addstr(&cap_buf, " push-options");
 	if (object_format_supported)
-		strbuf_addf(&cap_buf, " object-format=%s", the_hash_algo->name);
+		strbuf_addf(&cap_buf, " object-format=%s", r->hash_algo->name);
 	if (agent_supported)
 		strbuf_addf(&cap_buf, " agent=%s", git_user_agent_sanitized());
 	if (advertise_sid)
@@ -646,7 +649,7 @@ int send_pack(struct send_pack_args *args,
 	}
 
 	if (!args->dry_run)
-		advertise_shallow_grafts_buf(&req_buf);
+		advertise_shallow_grafts_buf(r, &req_buf);
 
 	/*
 	 * Finally, tell the other end!
@@ -686,7 +689,7 @@ int send_pack(struct send_pack_args *args,
 	}
 
 	if (args->stateless_rpc) {
-		if (!args->dry_run && (cmds_sent || is_repository_shallow(the_repository))) {
+		if (!args->dry_run && (cmds_sent || is_repository_shallow(r))) {
 			packet_buf_flush(&req_buf);
 			send_sideband(out, -1, req_buf.buf, req_buf.len, LARGE_PACKET_MAX);
 		}
@@ -711,7 +714,7 @@ int send_pack(struct send_pack_args *args,
 			   PACKET_READ_DIE_ON_ERR_PACKET);
 
 	if (need_pack_data && cmds_sent) {
-		if (pack_objects(out, remote_refs, extra_have, &commons, args) < 0) {
+		if (pack_objects(r, out, remote_refs, extra_have, &commons, args) < 0) {
 			if (args->stateless_rpc)
 				close(out);
 			if (git_connection_is_socket(conn))
@@ -724,7 +727,7 @@ int send_pack(struct send_pack_args *args,
 			 * we get one).
 			 */
 			if (status_report)
-				receive_status(&reader, remote_refs);
+				receive_status(r, &reader, remote_refs);
 
 			if (use_sideband) {
 				close(demux.out);
@@ -743,7 +746,7 @@ int send_pack(struct send_pack_args *args,
 		packet_flush(out);
 
 	if (status_report && cmds_sent)
-		ret = receive_status(&reader, remote_refs);
+		ret = receive_status(r, &reader, remote_refs);
 	else
 		ret = 0;
 	if (args->stateless_rpc)
diff --git a/send-pack.h b/send-pack.h
index 7edb80596c7b0edf607ea5cd0f01315106d02b73..d256715681b363d46db284b7ed22658960781571 100644
--- a/send-pack.h
+++ b/send-pack.h
@@ -6,6 +6,7 @@
 struct child_process;
 struct oid_array;
 struct ref;
+struct repository;
 
 /* Possible values for push_cert field in send_pack_args. */
 #define SEND_PACK_PUSH_CERT_NEVER 0
@@ -35,7 +36,7 @@ struct option;
 int option_parse_push_signed(const struct option *opt,
 			     const char *arg, int unset);
 
-int send_pack(struct send_pack_args *args,
+int send_pack(struct repository *r, struct send_pack_args *args,
 	      int fd[], struct child_process *conn,
 	      struct ref *remote_refs, struct oid_array *extra_have);
 
diff --git a/transport.c b/transport.c
index 10d820c33353f695691506560f817c7515218139..81ae8243b9a32ab5289149e51a5a4b46340ac1fe 100644
--- a/transport.c
+++ b/transport.c
@@ -932,7 +932,7 @@ static int git_transport_push(struct transport *transport, struct ref *remote_re
 		break;
 	case protocol_v1:
 	case protocol_v0:
-		ret = send_pack(&args, data->fd, data->conn, remote_refs,
+		ret = send_pack(the_repository, &args, data->fd, data->conn, remote_refs,
 				&data->extra_have);
 		break;
 	case protocol_unknown_version:
