summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Beller <sbeller@google.com>2017-01-25 16:33:29 -0800
committerJunio C Hamano <gitster@pobox.com>2017-01-26 10:46:46 -0800
commitb6972977ab45e8fa74f38fe89f7d2ac8deb0cc4a (patch)
treedcf2fbb2e6814b51aa4c4f05871601e3b5742294
parent04a1d8b1ae5eeecb90675cfaca2850bf26269485 (diff)
downloadgit-sb/push-make-submodule-check-the-default.tar.gz
Revert "push: change submodule default to check when submodules exist"sb/push-make-submodule-check-the-default
This reverts commit 04a1d8b1ae5eeecb90675cfaca2850bf26269485. In the previous commit we set push.recurseSubmodules to "check" by default. This check is done by walking all remote refs that are known. For remotes we only store the refs/heads/* (and tags), which doesn't include all commits. In e.g. Gerrit commits often end up at refs/changes/* (that we do not store) when pushing to refs/for/master (which we also do not store). So a workflow such as the following still fails: $ git -C <submodule> push origin HEAD:refs/for/master $ git push origin HEAD:refs/for/master The following submodule paths contain changes that can not be found on any remote: submodule Please try git push --recurse-submodules=on-demand or cd to the path and use git push to push them to a remote. Trying to push with --recurse-submodules={on-demand,check} would run into the same problem, yielding the same error message. So changing the default to check for submodules is clearly not working as intended for Gerrit users. We need another option that works for them. For now just revert the change of the default. A future patch to address this problem would be add another option that treats the submodules differently: 1) check if the submodule needs pushing (as currently done in "check") 2) for those submodules that need pushing we run a command, e.g. git push with the refspec passed down exactly as is. This would work for the Gerrit case, as HEAD:refs/for/master is correct for both the superproject and the submodule. 3) Unlike in "on-demand", we would not check again after performing step 2), as we would not find the newly pushed things at Gerrit. Once we have such an option, we can default to "check" again, and the error message would mention both on-demand as well as this new option. I'd imagine "on-demand" is what works in branch driven code review systems such as github; for Gerrit which is based on changes the option outlined above would work. Signed-off-by: Stefan Beller <sbeller@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin/push.c16
-rwxr-xr-xt/t5531-deep-submodule-push.sh6
2 files changed, 2 insertions, 20 deletions
diff --git a/builtin/push.c b/builtin/push.c
index 9e0b8dba9a..3bb9d6b7e6 100644
--- a/builtin/push.c
+++ b/builtin/push.c
@@ -3,7 +3,6 @@
*/
#include "cache.h"
#include "refs.h"
-#include "dir.h"
#include "run-command.h"
#include "builtin.h"
#include "remote.h"
@@ -23,7 +22,6 @@ static int deleterefs;
static const char *receivepack;
static int verbosity;
static int progress = -1;
-static int has_submodules_configured;
static int recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
static enum transport_family family;
@@ -33,15 +31,6 @@ static const char **refspec;
static int refspec_nr;
static int refspec_alloc;
-static void preset_submodule_default(void)
-{
- if (has_submodules_configured || file_exists(git_path("modules")) ||
- (!is_bare_repository() && file_exists(".gitmodules")))
- recurse_submodules = RECURSE_SUBMODULES_CHECK;
- else
- recurse_submodules = RECURSE_SUBMODULES_OFF;
-}
-
static void add_refspec(const char *ref)
{
refspec_nr++;
@@ -506,9 +495,7 @@ static int git_push_config(const char *k, const char *v, void *cb)
const char *value;
if (!git_config_get_value("push.recursesubmodules", &value))
recurse_submodules = parse_push_recurse_submodules_arg(k, value);
- } else if (starts_with(k, "submodule.") && ends_with(k, ".url"))
- /* The submodule.<name>.url is used as a bit to indicate existence */
- has_submodules_configured = 1;
+ }
return git_default_config(k, v, NULL);
}
@@ -565,7 +552,6 @@ int cmd_push(int argc, const char **argv, const char *prefix)
};
packet_trace_identity("push");
- preset_submodule_default();
git_config(git_push_config, &flags);
argc = parse_options(argc, argv, prefix, options, push_usage, 0);
set_push_cert_flags(&flags, push_cert);
diff --git a/t/t5531-deep-submodule-push.sh b/t/t5531-deep-submodule-push.sh
index e690749e8a..198ce84754 100755
--- a/t/t5531-deep-submodule-push.sh
+++ b/t/t5531-deep-submodule-push.sh
@@ -65,11 +65,7 @@ test_expect_success 'push fails if submodule commit not on remote' '
git add gar/bage &&
git commit -m "Third commit for gar/bage" &&
# the push should fail with --recurse-submodules=check
- # on the command line. "check" is the default for repos in
- # which submodules are detected by existence of config,
- # .gitmodules file or an internal .git/modules/<submodule-repo>
- git submodule add -f ../submodule.git gar/bage &&
- test_must_fail git push ../pub.git master &&
+ # on the command line...
test_must_fail git push --recurse-submodules=check ../pub.git master &&
# ...or if specified in the configuration..