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

[PATCHv2 5/6] submodule update: add super-reference flag

From
Stefan Beller <sbeller@google.com>
Date
Aug 9, 2016, 04:08 UTC
Message-ID
<20160809040811.21408-7-sbeller@google.com>
In-Reply-To
<20160809040811.21408-1-sbeller@google.com>

When we have a another clone of a superproject, we may want to mirror the submodules using alternates. Introduce an option `--super-reference` that let's a user point to another superproject, which is assumed to have the same structure as the one they are running the "submodule update" command from and has all submodules checked out to borrow the submodule objects from within the other superprojects git directory.

Signed-off-by: Stefan Beller <sbeller@google.com>
---
 Documentation/git-submodule.txt |  8 +++++++-
 builtin/submodule--helper.c     | 14 +++++++++++++-
 git-submodule.sh                | 10 ++++++++++
 3 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
index bf3bb37..6f2f873 100644
--- a/Documentation/git-submodule.txt
+++ b/Documentation/git-submodule.txt
@@ -16,7 +16,7 @@ SYNOPSIS
 'git submodule' [--quiet] deinit [-f|--force] (--all|[--] <path>...)
 'git submodule' [--quiet] update [--init] [--remote] [-N|--no-fetch]
 	      [--[no-]recommend-shallow] [-f|--force] [--rebase|--merge]
-	      [--reference <repository>] [--depth <depth>] [--recursive]
+	      [--[super-]reference <repository>] [--depth <depth>] [--recursive]
 	      [--jobs <n>] [--] [<path>...]
 'git submodule' [--quiet] summary [--cached|--files] [(-n|--summary-limit) <n>]
 	      [commit] [--] [<path>...]
@@ -370,6 +370,12 @@ the submodule itself.
 	This option is only valid for add and update commands.  These
 	commands sometimes need to clone a remote repository. In this case,
 	this option will be passed to the linkgit:git-clone[1] command.
+
+--super-reference <superproject repository>::
+	This option is only valid for the update command. When update needs
+	to clone a repository, a reference will be passed to the clone command
+	that points at the submodule path inside the reference superproject.
+
 +
 *NOTE*: Do *not* use this option unless you have read the note
 for linkgit:git-clone[1]'s `--reference` and `--shared` options carefully.
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index b7710a7..ea6b27c 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -584,6 +584,7 @@ struct submodule_update_clone {
 	int quiet;
 	int recommend_shallow;
 	struct string_list references;
+	struct string_list super_references;
 	const char *depth;
 	const char *recursive_prefix;
 	const char *prefix;
@@ -600,7 +601,7 @@ struct submodule_update_clone {
 };
 #define SUBMODULE_UPDATE_CLONE_INIT {0, MODULE_LIST_INIT, 0, \
 	SUBMODULE_UPDATE_STRATEGY_INIT, 0, -1, STRING_LIST_INIT_DUP, \
-	NULL, NULL, NULL, \
+	STRING_LIST_INIT_DUP, NULL, NULL, NULL, \
 	STRING_LIST_INIT_DUP, 0, NULL, 0, 0}
 
 
@@ -715,6 +716,15 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
 		for_each_string_list_item(item, &suc->references)
 			argv_array_pushl(&child->args, "--reference", item->string, NULL);
 	}
+	if (suc->super_references.nr) {
+		struct string_list_item *item;
+		for_each_string_list_item(item, &suc->super_references) {
+			strbuf_reset(&sb);
+			argv_array_pushf(&child->args, "--reference=%s/%s",
+					 relative_path(item->string, suc->prefix, &sb),
+					 sub->path);
+		}
+	}
 	if (suc->depth)
 		argv_array_push(&child->args, suc->depth);
 
@@ -835,6 +845,8 @@ static int update_clone(int argc, const char **argv, const char *prefix)
 			   N_("rebase, merge, checkout or none")),
 		OPT_STRING_LIST(0, "reference", &suc.references, N_("repo"),
 			   N_("reference repository")),
+		OPT_STRING_LIST(0, "super-reference", &suc.super_references, N_("repo"),
+			   N_("superproject of a reference repository")),
 		OPT_STRING(0, "depth", &suc.depth, "<depth>",
 			   N_("Create a shallow clone truncated to the "
 			      "specified number of revisions")),
diff --git a/git-submodule.sh b/git-submodule.sh
index 3b412f5..17f4ace 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -34,6 +34,7 @@ command=
 branch=
 force=
 reference=
+superreference=
 cached=
 recursive=
 init=
@@ -520,6 +521,14 @@ cmd_update()
 		--reference=*)
 			reference="$1"
 			;;
+		--super-reference)
+			case "$2" in '') usage ;; esac
+			superreference="--super-reference=$2"
+			shift
+			;;
+		--super-reference=*)
+			superreference="$1"
+			;;
 		-m|--merge)
 			update="merge"
 			;;
@@ -576,6 +585,7 @@ cmd_update()
 		${prefix:+--recursive-prefix "$prefix"} \
 		${update:+--update "$update"} \
 		${reference:+"$reference"} \
+		${superreference:+"$superreference"} \
 		${depth:+--depth "$depth"} \
 		${recommend_shallow:+"$recommend_shallow"} \
 		${jobs:+$jobs} \
-- 
2.9.2.572.g9d9644e.dirty
Previous: Stefan BellerNext: Stefan Beller
Message 15 of 36 in “[PATCHv2 0/6] git clone: Marry --recursive and --reference”
  1. Stefan BellerAug 9, 2016
  2. 3/9 submodule--helper module-clone: allow multiple referencesStefan Beller, Aug 9, 2016
  3. 1/9 t7408: modernize styleStefan Beller, Aug 9, 2016
  4. Eric SunshineAug 9, 2016
  5. Junio C HamanoAug 9, 2016
  6. Junio C HamanoAug 9, 2016
  7. Stefan BellerAug 9, 2016
  8. Junio C HamanoAug 9, 2016
  9. Eric SunshineAug 9, 2016
  10. 2/9 t7408: merge short tests, factor out testing methodStefan Beller, Aug 9, 2016
  11. Junio C HamanoAug 9, 2016
  12. Stefan BellerAug 9, 2016
  13. 4/9 submodule--helper update-clone: allow multiple referencesStefan Beller, Aug 9, 2016
  14. 5/9 clone: clarify option_reference as requiredStefan Beller, Aug 9, 2016
  15. 5/6 submodule update: add super-reference flagStefan Beller, Aug 9, 2016
  16. 6/6 clone: reference flag is used for submodules as wellStefan Beller, Aug 9, 2016
  17. 9/9 submodule--helper: use parallel processor correctly.Stefan Beller, Aug 9, 2016
  18. Junio C HamanoAug 9, 2016
  19. 8/9 submodule: try alternates when superproject has an alternateStefan Beller, Aug 9, 2016
  20. 7/9 submodule helper: pass through --reference-if-ableStefan Beller, Aug 9, 2016
  21. 6/9 clone: implement optional referencesStefan Beller, Aug 9, 2016
  22. Junio C HamanoAug 9, 2016
  23. Junio C HamanoAug 9, 2016
  24. Stefan BellerAug 9, 2016
  25. Junio C HamanoAug 9, 2016
  26. Jacob KellerAug 9, 2016
  27. Junio C HamanoAug 9, 2016
  28. Stefan BellerAug 9, 2016
  29. Junio C HamanoAug 9, 2016
  30. Junio C HamanoAug 9, 2016
  31. Stefan BellerAug 9, 2016
  32. Junio C HamanoAug 9, 2016
  33. Stefan BellerAug 9, 2016
  34. Junio C HamanoAug 9, 2016
  35. Stefan BellerAug 9, 2016
  36. Junio C HamanoAug 10, 2016

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.