builtin/clone: introduce --ref-format=
value flag
Introduce a new `--ref-format` value flag for git-clone(1) that allows the user to specify the ref format that is to be used for a newly initialized repository. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
48fa45f5fb
commit
5ed860f51b
@ -311,6 +311,12 @@ or `--mirror` is given)
|
|||||||
The result is Git repository can be separated from working
|
The result is Git repository can be separated from working
|
||||||
tree.
|
tree.
|
||||||
|
|
||||||
|
--ref-format=<ref-format::
|
||||||
|
|
||||||
|
Specify the given ref storage format for the repository. The valid values are:
|
||||||
|
+
|
||||||
|
include::ref-storage-format.txt[]
|
||||||
|
|
||||||
-j <n>::
|
-j <n>::
|
||||||
--jobs <n>::
|
--jobs <n>::
|
||||||
The number of submodules fetched at the same time.
|
The number of submodules fetched at the same time.
|
||||||
|
@ -72,6 +72,7 @@ static char *remote_name = NULL;
|
|||||||
static char *option_branch = NULL;
|
static char *option_branch = NULL;
|
||||||
static struct string_list option_not = STRING_LIST_INIT_NODUP;
|
static struct string_list option_not = STRING_LIST_INIT_NODUP;
|
||||||
static const char *real_git_dir;
|
static const char *real_git_dir;
|
||||||
|
static const char *ref_format;
|
||||||
static char *option_upload_pack = "git-upload-pack";
|
static char *option_upload_pack = "git-upload-pack";
|
||||||
static int option_verbosity;
|
static int option_verbosity;
|
||||||
static int option_progress = -1;
|
static int option_progress = -1;
|
||||||
@ -157,6 +158,8 @@ static struct option builtin_clone_options[] = {
|
|||||||
N_("any cloned submodules will be shallow")),
|
N_("any cloned submodules will be shallow")),
|
||||||
OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"),
|
OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"),
|
||||||
N_("separate git dir from working tree")),
|
N_("separate git dir from working tree")),
|
||||||
|
OPT_STRING(0, "ref-format", &ref_format, N_("format"),
|
||||||
|
N_("specify the reference format to use")),
|
||||||
OPT_STRING_LIST('c', "config", &option_config, N_("key=value"),
|
OPT_STRING_LIST('c', "config", &option_config, N_("key=value"),
|
||||||
N_("set config inside the new repository")),
|
N_("set config inside the new repository")),
|
||||||
OPT_STRING_LIST(0, "server-option", &server_options,
|
OPT_STRING_LIST(0, "server-option", &server_options,
|
||||||
@ -932,6 +935,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
|
|||||||
int submodule_progress;
|
int submodule_progress;
|
||||||
int filter_submodules = 0;
|
int filter_submodules = 0;
|
||||||
int hash_algo;
|
int hash_algo;
|
||||||
|
unsigned int ref_storage_format = REF_STORAGE_FORMAT_UNKNOWN;
|
||||||
const int do_not_override_repo_unix_permissions = -1;
|
const int do_not_override_repo_unix_permissions = -1;
|
||||||
|
|
||||||
struct transport_ls_refs_options transport_ls_refs_options =
|
struct transport_ls_refs_options transport_ls_refs_options =
|
||||||
@ -957,6 +961,12 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
|
|||||||
if (option_single_branch == -1)
|
if (option_single_branch == -1)
|
||||||
option_single_branch = deepen ? 1 : 0;
|
option_single_branch = deepen ? 1 : 0;
|
||||||
|
|
||||||
|
if (ref_format) {
|
||||||
|
ref_storage_format = ref_storage_format_by_name(ref_format);
|
||||||
|
if (ref_storage_format == REF_STORAGE_FORMAT_UNKNOWN)
|
||||||
|
die(_("unknown ref storage format '%s'"), ref_format);
|
||||||
|
}
|
||||||
|
|
||||||
if (option_mirror)
|
if (option_mirror)
|
||||||
option_bare = 1;
|
option_bare = 1;
|
||||||
|
|
||||||
@ -1108,7 +1118,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
|
|||||||
* their on-disk data structures.
|
* their on-disk data structures.
|
||||||
*/
|
*/
|
||||||
init_db(git_dir, real_git_dir, option_template, GIT_HASH_UNKNOWN,
|
init_db(git_dir, real_git_dir, option_template, GIT_HASH_UNKNOWN,
|
||||||
REF_STORAGE_FORMAT_UNKNOWN, NULL,
|
ref_storage_format, NULL,
|
||||||
do_not_override_repo_unix_permissions, INIT_DB_QUIET | INIT_DB_SKIP_REFDB);
|
do_not_override_repo_unix_permissions, INIT_DB_QUIET | INIT_DB_SKIP_REFDB);
|
||||||
|
|
||||||
if (real_git_dir) {
|
if (real_git_dir) {
|
||||||
|
@ -157,6 +157,23 @@ test_expect_success 'clone --mirror does not repeat tags' '
|
|||||||
|
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'clone with files ref format' '
|
||||||
|
test_when_finished "rm -rf ref-storage" &&
|
||||||
|
git clone --ref-format=files --mirror src ref-storage &&
|
||||||
|
echo files >expect &&
|
||||||
|
git -C ref-storage rev-parse --show-ref-format >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'clone with garbage ref format' '
|
||||||
|
cat >expect <<-EOF &&
|
||||||
|
fatal: unknown ref storage format ${SQ}garbage${SQ}
|
||||||
|
EOF
|
||||||
|
test_must_fail git clone --ref-format=garbage --mirror src ref-storage 2>err &&
|
||||||
|
test_cmp expect err &&
|
||||||
|
test_path_is_missing ref-storage
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success 'clone to destination with trailing /' '
|
test_expect_success 'clone to destination with trailing /' '
|
||||||
|
|
||||||
git clone src target-1/ &&
|
git clone src target-1/ &&
|
||||||
|
Reference in New Issue
Block a user