clone: allow "--dissociate" without reference
The "--reference" option is not the only way to provide a repository to borrow objects from. A repository that borrows from another repository can be cloned with "clone --local" and the resulting repository will borrow from the same repository, which the user may want to "--dissociate" from. Signed-off-by: Alex Riesen <raa.lkml@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
74301d6ede
commit
0181681e92
@ -104,8 +104,13 @@ objects from the source repository into a pack in the cloned repository.
|
|||||||
--dissociate::
|
--dissociate::
|
||||||
Borrow the objects from reference repositories specified
|
Borrow the objects from reference repositories specified
|
||||||
with the `--reference` options only to reduce network
|
with the `--reference` options only to reduce network
|
||||||
transfer and stop borrowing from them after a clone is made
|
transfer, and stop borrowing from them after a clone is made
|
||||||
by making necessary local copies of borrowed objects.
|
by making necessary local copies of borrowed objects. This
|
||||||
|
option can also be used when cloning locally from a
|
||||||
|
repository that already borrows objects from another
|
||||||
|
repository--the new repository will borrow objects from the
|
||||||
|
same repository, and this option can be used to stop the
|
||||||
|
borrowing.
|
||||||
|
|
||||||
--quiet::
|
--quiet::
|
||||||
-q::
|
-q::
|
||||||
|
@ -801,12 +801,16 @@ static void write_refspec_config(const char *src_ref_prefix,
|
|||||||
static void dissociate_from_references(void)
|
static void dissociate_from_references(void)
|
||||||
{
|
{
|
||||||
static const char* argv[] = { "repack", "-a", "-d", NULL };
|
static const char* argv[] = { "repack", "-a", "-d", NULL };
|
||||||
|
char *alternates = git_pathdup("objects/info/alternates");
|
||||||
|
|
||||||
|
if (!access(alternates, F_OK)) {
|
||||||
if (run_command_v_opt(argv, RUN_GIT_CMD|RUN_COMMAND_NO_STDIN))
|
if (run_command_v_opt(argv, RUN_GIT_CMD|RUN_COMMAND_NO_STDIN))
|
||||||
die(_("cannot repack to clean up"));
|
die(_("cannot repack to clean up"));
|
||||||
if (unlink(git_path("objects/info/alternates")) && errno != ENOENT)
|
if (unlink(alternates) && errno != ENOENT)
|
||||||
die_errno(_("cannot unlink temporary alternates file"));
|
die_errno(_("cannot unlink temporary alternates file"));
|
||||||
}
|
}
|
||||||
|
free(alternates);
|
||||||
|
}
|
||||||
|
|
||||||
int cmd_clone(int argc, const char **argv, const char *prefix)
|
int cmd_clone(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
@ -954,10 +958,6 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
|
|||||||
|
|
||||||
if (option_reference.nr)
|
if (option_reference.nr)
|
||||||
setup_reference();
|
setup_reference();
|
||||||
else if (option_dissociate) {
|
|
||||||
warning(_("--dissociate given, but there is no --reference"));
|
|
||||||
option_dissociate = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
fetch_pattern = value.buf;
|
fetch_pattern = value.buf;
|
||||||
refspec = parse_fetch_refspec(1, &fetch_pattern);
|
refspec = parse_fetch_refspec(1, &fetch_pattern);
|
||||||
|
@ -210,4 +210,15 @@ test_expect_success 'clone, dissociate from partial reference and repack' '
|
|||||||
test_line_count = 1 packs.txt
|
test_line_count = 1 packs.txt
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'clone, dissociate from alternates' '
|
||||||
|
rm -fr A B C &&
|
||||||
|
test_create_repo A &&
|
||||||
|
commit_in A file1 &&
|
||||||
|
git clone --reference=A A B &&
|
||||||
|
test_line_count = 1 B/.git/objects/info/alternates &&
|
||||||
|
git clone --local --dissociate B C &&
|
||||||
|
! test -f C/.git/objects/info/alternates &&
|
||||||
|
( cd C && git fsck )
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Reference in New Issue
Block a user