Merge branch 'jc/clone-borrow'
Allow "git clone --reference" to be used more safely. * jc/clone-borrow: clone: --dissociate option to mark that reference is only temporary
This commit is contained in:
@ -49,6 +49,7 @@ static int option_verbosity;
|
||||
static int option_progress = -1;
|
||||
static struct string_list option_config;
|
||||
static struct string_list option_reference;
|
||||
static int option_dissociate;
|
||||
|
||||
static int opt_parse_reference(const struct option *opt, const char *arg, int unset)
|
||||
{
|
||||
@ -94,6 +95,8 @@ static struct option builtin_clone_options[] = {
|
||||
N_("create a shallow clone of that depth")),
|
||||
OPT_BOOL(0, "single-branch", &option_single_branch,
|
||||
N_("clone only one branch, HEAD or --branch")),
|
||||
OPT_BOOL(0, "dissociate", &option_dissociate,
|
||||
N_("use --reference only while cloning")),
|
||||
OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"),
|
||||
N_("separate git dir from working tree")),
|
||||
OPT_STRING_LIST('c', "config", &option_config, N_("key=value"),
|
||||
@ -735,6 +738,16 @@ static void write_refspec_config(const char *src_ref_prefix,
|
||||
strbuf_release(&value);
|
||||
}
|
||||
|
||||
static void dissociate_from_references(void)
|
||||
{
|
||||
static const char* argv[] = { "repack", "-a", "-d", NULL };
|
||||
|
||||
if (run_command_v_opt(argv, RUN_GIT_CMD|RUN_COMMAND_NO_STDIN))
|
||||
die(_("cannot repack to clean up"));
|
||||
if (unlink(git_path("objects/info/alternates")) && errno != ENOENT)
|
||||
die_errno(_("cannot unlink temporary alternates file"));
|
||||
}
|
||||
|
||||
int cmd_clone(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
int is_bundle = 0, is_local;
|
||||
@ -880,6 +893,10 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
|
||||
|
||||
if (option_reference.nr)
|
||||
setup_reference();
|
||||
else if (option_dissociate) {
|
||||
warning(_("--dissociate given, but there is no --reference"));
|
||||
option_dissociate = 0;
|
||||
}
|
||||
|
||||
fetch_pattern = value.buf;
|
||||
refspec = parse_fetch_refspec(1, &fetch_pattern);
|
||||
@ -993,6 +1010,9 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
|
||||
transport_unlock_pack(transport);
|
||||
transport_disconnect(transport);
|
||||
|
||||
if (option_dissociate)
|
||||
dissociate_from_references();
|
||||
|
||||
junk_mode = JUNK_LEAVE_REPO;
|
||||
err = checkout();
|
||||
|
||||
|
Reference in New Issue
Block a user