Merge branch 'jt/submodule-on-demand'
Push all submodules recursively with '--recurse-submodules=on-demand'. * jt/submodule-on-demand: Doc: document push.recurseSubmodules=only
This commit is contained in:
commit
173fc54b00
@ -110,18 +110,8 @@ This will result in only b (a and c are cleared).
|
|||||||
----
|
----
|
||||||
|
|
||||||
push.recurseSubmodules::
|
push.recurseSubmodules::
|
||||||
Make sure all submodule commits used by the revisions to be pushed
|
May be "check", "on-demand", "only", or "no", with the same behavior
|
||||||
are available on a remote-tracking branch. If the value is 'check'
|
as that of "push --recurse-submodules".
|
||||||
then Git will verify that all submodule commits that changed in the
|
|
||||||
revisions to be pushed are available on at least one remote of the
|
|
||||||
submodule. If any commits are missing, the push will be aborted and
|
|
||||||
exit with non-zero status. If the value is 'on-demand' then all
|
|
||||||
submodules that changed in the revisions to be pushed will be
|
|
||||||
pushed. If on-demand was not able to push all necessary revisions
|
|
||||||
it will also be aborted and exit with non-zero status. If the value
|
|
||||||
is 'no' then default behavior of ignoring submodules when pushing
|
|
||||||
is retained. You may override this configuration at time of push by
|
|
||||||
specifying '--recurse-submodules=check|on-demand|no'.
|
|
||||||
If not set, 'no' is used by default, unless 'submodule.recurse' is
|
If not set, 'no' is used by default, unless 'submodule.recurse' is
|
||||||
set (in which case a 'true' value means 'on-demand').
|
set (in which case a 'true' value means 'on-demand').
|
||||||
|
|
||||||
|
@ -409,10 +409,14 @@ Specifying `--no-force-if-includes` disables this behavior.
|
|||||||
all submodules that changed in the revisions to be pushed will be
|
all submodules that changed in the revisions to be pushed will be
|
||||||
pushed. If on-demand was not able to push all necessary revisions it will
|
pushed. If on-demand was not able to push all necessary revisions it will
|
||||||
also be aborted and exit with non-zero status. If 'only' is used all
|
also be aborted and exit with non-zero status. If 'only' is used all
|
||||||
submodules will be recursively pushed while the superproject is left
|
submodules will be pushed while the superproject is left
|
||||||
unpushed. A value of 'no' or using `--no-recurse-submodules` can be used
|
unpushed. A value of 'no' or using `--no-recurse-submodules` can be used
|
||||||
to override the push.recurseSubmodules configuration variable when no
|
to override the push.recurseSubmodules configuration variable when no
|
||||||
submodule recursion is required.
|
submodule recursion is required.
|
||||||
|
+
|
||||||
|
When using 'on-demand' or 'only', if a submodule has a
|
||||||
|
"push.recurseSubmodules={on-demand,only}" or "submodule.recurse" configuration,
|
||||||
|
further recursion will occur. In this case, "only" is treated as "on-demand".
|
||||||
|
|
||||||
--[no-]verify::
|
--[no-]verify::
|
||||||
Toggle the pre-push hook (see linkgit:githooks[5]). The
|
Toggle the pre-push hook (see linkgit:githooks[5]). The
|
||||||
|
@ -466,8 +466,16 @@ static int option_parse_recurse_submodules(const struct option *opt,
|
|||||||
|
|
||||||
if (unset)
|
if (unset)
|
||||||
*recurse_submodules = RECURSE_SUBMODULES_OFF;
|
*recurse_submodules = RECURSE_SUBMODULES_OFF;
|
||||||
else
|
else {
|
||||||
|
if (!strcmp(arg, "only-is-on-demand")) {
|
||||||
|
if (*recurse_submodules == RECURSE_SUBMODULES_ONLY) {
|
||||||
|
warning(_("recursing into submodule with push.recurseSubmodules=only; using on-demand instead"));
|
||||||
|
*recurse_submodules = RECURSE_SUBMODULES_ON_DEMAND;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
*recurse_submodules = parse_push_recurse_submodules_arg(opt->long_name, arg);
|
*recurse_submodules = parse_push_recurse_submodules_arg(opt->long_name, arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1130,6 +1130,12 @@ static int push_submodule(const char *path,
|
|||||||
if (for_each_remote_ref_submodule(path, has_remote, NULL) > 0) {
|
if (for_each_remote_ref_submodule(path, has_remote, NULL) > 0) {
|
||||||
struct child_process cp = CHILD_PROCESS_INIT;
|
struct child_process cp = CHILD_PROCESS_INIT;
|
||||||
strvec_push(&cp.args, "push");
|
strvec_push(&cp.args, "push");
|
||||||
|
/*
|
||||||
|
* When recursing into a submodule, treat any "only" configurations as "on-
|
||||||
|
* demand", since "only" would not work (we need all submodules to be pushed
|
||||||
|
* in order to be able to push the superproject).
|
||||||
|
*/
|
||||||
|
strvec_push(&cp.args, "--recurse-submodules=only-is-on-demand");
|
||||||
if (dry_run)
|
if (dry_run)
|
||||||
strvec_push(&cp.args, "--dry-run");
|
strvec_push(&cp.args, "--dry-run");
|
||||||
|
|
||||||
|
@ -512,6 +512,56 @@ test_expect_success 'push only unpushed submodules recursively' '
|
|||||||
test_cmp expected_pub actual_pub
|
test_cmp expected_pub actual_pub
|
||||||
'
|
'
|
||||||
|
|
||||||
|
setup_subsub () {
|
||||||
|
git init upstream &&
|
||||||
|
git init upstream/sub &&
|
||||||
|
git init upstream/sub/deepsub &&
|
||||||
|
test_commit -C upstream/sub/deepsub innermost &&
|
||||||
|
git -C upstream/sub submodule add ./deepsub deepsub &&
|
||||||
|
git -C upstream/sub commit -m middle &&
|
||||||
|
git -C upstream submodule add ./sub sub &&
|
||||||
|
git -C upstream commit -m outermost &&
|
||||||
|
|
||||||
|
git -c protocol.file.allow=always clone --recurse-submodules upstream downstream &&
|
||||||
|
git -C downstream/sub/deepsub checkout -b downstream-branch &&
|
||||||
|
git -C downstream/sub checkout -b downstream-branch &&
|
||||||
|
git -C downstream checkout -b downstream-branch
|
||||||
|
}
|
||||||
|
|
||||||
|
new_downstream_commits () {
|
||||||
|
test_commit -C downstream/sub/deepsub new-innermost &&
|
||||||
|
git -C downstream/sub add deepsub &&
|
||||||
|
git -C downstream/sub commit -m new-middle &&
|
||||||
|
git -C downstream add sub &&
|
||||||
|
git -C downstream commit -m new-outermost
|
||||||
|
}
|
||||||
|
|
||||||
|
test_expect_success 'push with push.recurseSubmodules=only on superproject' '
|
||||||
|
test_when_finished rm -rf upstream downstream &&
|
||||||
|
setup_subsub &&
|
||||||
|
new_downstream_commits &&
|
||||||
|
git -C downstream config push.recurseSubmodules only &&
|
||||||
|
git -C downstream push origin downstream-branch &&
|
||||||
|
|
||||||
|
test_must_fail git -C upstream rev-parse refs/heads/downstream-branch &&
|
||||||
|
git -C upstream/sub rev-parse refs/heads/downstream-branch &&
|
||||||
|
test_must_fail git -C upstream/sub/deepsub rev-parse refs/heads/downstream-branch
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'push with push.recurseSubmodules=only on superproject and top-level submodule' '
|
||||||
|
test_when_finished rm -rf upstream downstream &&
|
||||||
|
setup_subsub &&
|
||||||
|
new_downstream_commits &&
|
||||||
|
git -C downstream config push.recurseSubmodules only &&
|
||||||
|
git -C downstream/sub config push.recurseSubmodules only &&
|
||||||
|
git -C downstream push origin downstream-branch 2> err &&
|
||||||
|
|
||||||
|
test_must_fail git -C upstream rev-parse refs/heads/downstream-branch &&
|
||||||
|
git -C upstream/sub rev-parse refs/heads/downstream-branch &&
|
||||||
|
git -C upstream/sub/deepsub rev-parse refs/heads/downstream-branch &&
|
||||||
|
grep "recursing into submodule with push.recurseSubmodules=only; using on-demand instead" err
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success 'push propagating the remotes name to a submodule' '
|
test_expect_success 'push propagating the remotes name to a submodule' '
|
||||||
git -C work remote add origin ../pub.git &&
|
git -C work remote add origin ../pub.git &&
|
||||||
git -C work remote add pub ../pub.git &&
|
git -C work remote add pub ../pub.git &&
|
||||||
|
Loading…
Reference in New Issue
Block a user