git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] Consider object stores in alternates during a dissociating clone

From
Junio C Hamano <gitster@pobox.com>
Date
Oct 22, 2015, 17:50 UTC
Message-ID
<xmqqd1w6ssg5.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<562911AD.50004@cetitec.com>
Alexander Riesen <alexander.riesen@cetitec.com> writes:
>> Content-Type: text/plain; charset=windows-1252; format=flowed

I had to hand-munge it as the above lost all tabs and made the patch unusable for machines X-<.

Re-reading the documentation, I realized that the use case this new mode of operation allows is totally outside of the original design space that was described, so I added a note to teach users how the option can be used in a new way as well.

So here is what I tentatively queued.
Thanks.
-- >8 --
From: Alex Riesen <raa.lkml@gmail.com>
Date: Thu, 22 Oct 2015 18:41:17 +0200
Subject: [PATCH] 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>
---
 Documentation/git-clone.txt |  9 +++++++--
 builtin/clone.c             | 16 ++++++++--------
 t/t5700-clone-reference.sh  | 11 +++++++++++
 3 files changed, 26 insertions(+), 10 deletions(-)
diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt
index f1f2a3f..a8c11e3 100644
--- a/Documentation/git-clone.txt
+++ b/Documentation/git-clone.txt
@@ -104,8 +104,13 @@ objects from the source repository into a pack in the cloned repository.
 --dissociate::
 	Borrow the objects from reference repositories specified
 	with the `--reference` options only to reduce network
-	transfer and stop borrowing from them after a clone is made
-	by making necessary local copies of borrowed objects.
+	transfer, and stop borrowing from them after a clone is made
+	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::
 -q::
diff --git a/builtin/clone.c b/builtin/clone.c
index 9eaecd9..caae43e 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -801,11 +801,15 @@ static void write_refspec_config(const char *src_ref_prefix,
 static void dissociate_from_references(void)
 {
 	static const char* argv[] = { "repack", "-a", "-d", NULL };
+	char *alternates = git_pathdup("objects/info/alternates");
 
-	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"));
+	if (!access(alternates, F_OK)) {
+		if (run_command_v_opt(argv, RUN_GIT_CMD|RUN_COMMAND_NO_STDIN))
+			die(_("cannot repack to clean up"));
+		if (unlink(alternates) && errno != ENOENT)
+			die_errno(_("cannot unlink temporary alternates file"));
+	}
+	free(alternates);
 }
 
 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)
 		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);
diff --git a/t/t5700-clone-reference.sh b/t/t5700-clone-reference.sh
index 2250ef4..dfa1bf7 100755
--- a/t/t5700-clone-reference.sh
+++ b/t/t5700-clone-reference.sh
@@ -210,4 +210,15 @@ test_expect_success 'clone, dissociate from partial reference and repack' '
 	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
-- 
2.6.2-383-g4ea3cbc
Previous: Alexander RiesenNext: Alexander Riesen
Message 9 of 16 in “Use the alternates of the source repository for dissociating clone”
  1. Use the alternates of the source repository for dissociating cloneAlexander Riesen, Oct 15, 2015
  2. Johannes SchindelinOct 15, 2015
  3. Allow "clone --dissociate" to dissociate from alternatesAlexander Riesen, Oct 15, 2015
  4. Alexander RiesenOct 21, 2015
  5. Junio C HamanoOct 21, 2015
  6. Consider object stores in alternates during a dissociating cloneAlexander Riesen, Oct 22, 2015
  7. Junio C HamanoOct 22, 2015
  8. Alexander RiesenOct 22, 2015
  9. Junio C HamanoOct 22, 2015
  10. Alexander RiesenOct 22, 2015
  11. Junio C HamanoOct 22, 2015
  12. Junio C HamanoOct 22, 2015
  13. Documentation: AsciiDoc spells em-dash as double-dashes, not tripleJunio C Hamano, Oct 22, 2015
  14. Johannes LöthbergOct 23, 2015
  15. Junio C HamanoOct 15, 2015
  16. Alexander RiesenOct 16, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.