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

[PATCH] Use the alternates of the source repository for dissociating clone

From
Alexander Riesen <alexander.riesen@cetitec.com>
Date
Oct 15, 2015, 11:28 UTC
Message-ID
<561F8DE9.4040703@cetitec.com>

The "--dissociate" option required reference repositories, which sometimes demanded a look into the objects/info/alternates by the user. As this is something which can be figured out automatically, do it in the clone unless there is no other reference repositories.

Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
---
I often (enough) did something like this (preparing for manual backup):
     # Run mc (the Midnight Commander, it is a console (ncurses) file manager with
     # two panels).
     # Select a repository.
     $ git clone --mirror --dissociate \
       $(sed -e 's|\(.*\)/objects|--reference \1| -- 
%f/.git/objects/info/alternates' 2>/dev/null) \
       %f %D/%f
     # (except that this is one long line in mc)

The '%f' expands to a selected directory on the current panel, %D - to the current directory on the other panel. But as I see, the combination of the options "--dissociate" and no given references is not used for anything but giving the warning yet. So maybe it can be used as a shortcut for the above?

  builtin/clone.c | 42 ++++++++++++++++++++++++++++++++++++++----
  1 file changed, 38 insertions(+), 4 deletions(-)
diff --git a/builtin/clone.c b/builtin/clone.c
index 578da85..344bf21 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -791,6 +791,38 @@ static void write_refspec_config(const char *src_ref_prefix,
      strbuf_release(&value);
  }

+static int copy_alternates_to_references(const char *src_repo)
+{
+    int refcnt = -1;
+    char *src_alternates = mkpathdup("%s/objects/info/alternates", src_repo);
+    FILE *in = fopen(src_alternates, "r");
+    if (in) {
+        struct strbuf line = STRBUF_INIT;
+        refcnt = 0;
+        while (strbuf_getline(&line, in, '\n') != EOF) {
+            struct string_list_item item;
+            if (line.len < 8 || line.buf[0] == '#')
+                continue;
+            ++refcnt;
+            if (!strcmp(line.buf + line.len - 8, "/objects"))
+                line.buf[line.len - 8] = '\0';
+            if (is_absolute_path(line.buf)) {
+                item.string = line.buf;
+                add_one_reference(&item, NULL);
+                continue;
+            }
+            item.string = mkpathdup("%s/objects/%s", src_repo, line.buf);
+            normalize_path_copy(item.string, item.string);
+            add_one_reference(&item, NULL);
+            free(item.string);
+        }
+        strbuf_release(&line);
+        fclose(in);
+    }
+    free(src_alternates);
+    return refcnt;
+}
+
  static void dissociate_from_references(void)
  {
      static const char* argv[] = { "repack", "-a", "-d", NULL };
@@ -947,10 +979,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);
@@ -976,6 +1004,12 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
          warning(_("--local is ignored"));
      transport->cloning = 1;

+    if (!option_reference.nr && option_dissociate &&
+        copy_alternates_to_references(path) <= 0) {
+        warning(_("--dissociate given, but there is no --reference"));
+        option_dissociate = 0;
+    }
+
      if (!transport->get_refs_list || (!is_local && !transport->fetch))
          die(_("Don't know how to clone %s"), transport->url);
-- 
2.6.1.150.gb633014
Next: Johannes Schindelin
Message 1 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.