submodule--helper: advise on fatal alternate error
When recursively cloning a superproject with some shallow modules
defined in its .gitmodules, then recloning with "--reference=<path>", an
error occurs. For example:
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
master
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
--reference master master2
fails with:
fatal: submodule '<snip>' cannot add alternate: reference repository
'<snip>' is shallow
When a alternate computed from the superproject's alternate cannot be
added, whether in this case or another, advise about configuring the
"submodule.alternateErrorStrategy" configuration option and using
"--reference-if-able" instead of "--reference" when cloning.
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jonathan Tan committedDec 2, 2019 at 11:57 UTC4f3e57ef13d0ad4c00d0a87f0858cde81456a2e0
4 files changed+16
Documentation/config/advice.txt
+3
index 6aaa360202..d4e698cd3f 100644--- a/Documentation/config/advice.txt+++ b/Documentation/config/advice.txt@@ -107,4 +107,7 @@ advice.*:: editor input from the user. nestedTag:: Advice shown if a user attempts to recursively tag a tag object.+ submoduleAlternateErrorStrategyDie:+ Advice shown when a submodule.alternateErrorStrategy option+ configured to "die" causes a fatal error. --
advice.c
+2
index 3ee0ee2d8f..249c60dcf3 100644--- a/advice.c+++ b/advice.c@@ -30,6 +30,7 @@ int advice_waiting_for_editor = 1; int advice_graft_file_deprecated = 1; int advice_checkout_ambiguous_remote_branch_name = 1; int advice_nested_tag = 1;+int advice_submodule_alternate_error_strategy_die = 1; static int advice_use_color = -1; static char advice_colors[][COLOR_MAXLEN] = {@@ -89,6 +90,7 @@ static struct { { "graftFileDeprecated", &advice_graft_file_deprecated }, { "checkoutAmbiguousRemoteBranchName", &advice_checkout_ambiguous_remote_branch_name }, { "nestedTag", &advice_nested_tag },+ { "submoduleAlternateErrorStrategyDie", &advice_submodule_alternate_error_strategy_die }, /* make this an alias for backward compatibility */ { "pushNonFastForward", &advice_push_update_rejected }
advice.h
+1
index d015404843..b706780614 100644--- a/advice.h+++ b/advice.h@@ -30,6 +30,7 @@ extern int advice_waiting_for_editor; extern int advice_graft_file_deprecated; extern int advice_checkout_ambiguous_remote_branch_name; extern int advice_nested_tag;+extern int advice_submodule_alternate_error_strategy_die; int git_default_advice_config(const char *var, const char *value); __attribute__((format (printf, 1, 2)))
builtin/submodule--helper.c
+10
index 2c2395a620..12d546dfbb 100644--- a/builtin/submodule--helper.c+++ b/builtin/submodule--helper.c@@ -19,6 +19,7 @@ #include "diffcore.h" #include "diff.h" #include "object-store.h"+#include "advice.h" #define OPT_QUIET (1 << 0) #define OPT_CACHED (1 << 1)@@ -1268,6 +1269,13 @@ struct submodule_alternate_setup { #define SUBMODULE_ALTERNATE_SETUP_INIT { NULL, \ SUBMODULE_ALTERNATE_ERROR_IGNORE, NULL }+static const char alternate_error_advice[] = N_(+"An alternate computed from a superproject's alternate is invalid.\n"+"To allow Git to clone without an alternate in such a case, set\n"+"submodule.alternateErrorStrategy to 'info' or, equivalently, clone with\n"+"'--reference-if-able' instead of '--reference'."+);+ static int add_possible_reference_from_superproject( struct object_directory *odb, void *sas_cb) {@@ -1299,6 +1307,8 @@ static int add_possible_reference_from_superproject( } else { switch (sas->error_mode) { case SUBMODULE_ALTERNATE_ERROR_DIE:+ if (advice_submodule_alternate_error_strategy_die)+ advise(_(alternate_error_advice)); die(_("submodule '%s' cannot add alternate: %s"), sas->submodule_name, err.buf); case SUBMODULE_ALTERNATE_ERROR_INFO: