@@ -926,6 +926,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
926
926
struct ref * mapped_refs = NULL ;
927
927
const struct ref * ref ;
928
928
struct strbuf key = STRBUF_INIT ;
929
+ struct strbuf buf = STRBUF_INIT ;
929
930
struct strbuf branch_top = STRBUF_INIT , reflog_msg = STRBUF_INIT ;
930
931
struct transport * transport = NULL ;
931
932
const char * src_ref_prefix = "refs/heads/" ;
@@ -1125,6 +1126,50 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
1125
1126
git_dir = real_git_dir ;
1126
1127
}
1127
1128
1129
+ /*
1130
+ * We have a chicken-and-egg situation between initializing the refdb
1131
+ * and spawning transport helpers:
1132
+ *
1133
+ * - Initializing the refdb requires us to know about the object
1134
+ * format. We thus have to spawn the transport helper to learn
1135
+ * about it.
1136
+ *
1137
+ * - The transport helper may want to access the Git repository. But
1138
+ * because the refdb has not been initialized, we don't have "HEAD"
1139
+ * or "refs/". Thus, the helper cannot find the Git repository.
1140
+ *
1141
+ * Ideally, we would have structured the helper protocol such that it's
1142
+ * mandatory for the helper to first announce its capabilities without
1143
+ * yet assuming a fully initialized repository. Like that, we could
1144
+ * have added a "lazy-refdb-init" capability that announces whether the
1145
+ * helper is ready to handle not-yet-initialized refdbs. If any helper
1146
+ * didn't support them, we would have fully initialized the refdb with
1147
+ * the SHA1 object format, but later on bailed out if we found out that
1148
+ * the remote repository used a different object format.
1149
+ *
1150
+ * But we didn't, and thus we use the following workaround to partially
1151
+ * initialize the repository's refdb such that it can be discovered by
1152
+ * Git commands. To do so, we:
1153
+ *
1154
+ * - Create an invalid HEAD ref pointing at "refs/heads/.invalid".
1155
+ *
1156
+ * - Create the "refs/" directory.
1157
+ *
1158
+ * - Set up the ref storage format and repository version as
1159
+ * required.
1160
+ *
1161
+ * This is sufficient for Git commands to discover the Git directory.
1162
+ */
1163
+ initialize_repository_version (GIT_HASH_UNKNOWN ,
1164
+ the_repository -> ref_storage_format , 1 );
1165
+
1166
+ strbuf_addf (& buf , "%s/HEAD" , git_dir );
1167
+ write_file (buf .buf , "ref: refs/heads/.invalid" );
1168
+
1169
+ strbuf_reset (& buf );
1170
+ strbuf_addf (& buf , "%s/refs" , git_dir );
1171
+ safe_create_dir (buf .buf , 1 );
1172
+
1128
1173
/*
1129
1174
* additional config can be injected with -c, make sure it's included
1130
1175
* after init_db, which clears the entire config environment.
@@ -1453,6 +1498,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
1453
1498
free (remote_name );
1454
1499
strbuf_release (& reflog_msg );
1455
1500
strbuf_release (& branch_top );
1501
+ strbuf_release (& buf );
1456
1502
strbuf_release (& key );
1457
1503
free_refs (mapped_refs );
1458
1504
free_refs (remote_head_points_at );
0 commit comments