submodule: fall back to remote's HEAD for missing remote.<name>.branch
When `remote.<name>.branch` is not configured, `git submodule update`
currently falls back to using the branch name `master`. A much better
idea, however, is to use the remote `HEAD`: on all Git servers running
reasonably recent Git versions, the symref `HEAD` points to the main
branch.
Note: t7419 demonstrates that there _might_ be use cases out there that
_expect_ `git submodule update --remote` to update submodules to the
remote `master` branch even if the remote `HEAD` points to another
branch. Arguably, this patch makes the behavior more intuitive, but
there is a slight possibility that this might cause regressions in
obscure setups.
Even so, it should be okay to fix this behavior without anything like a
longer transition period:
- The `git submodule update --remote` command is not really common.
- Current Git's behavior when running this command is outright
confusing, unless the remote repository's current branch _is_ `master`
(in which case the proposed behavior matches the old behavior).
- If a user encounters a regression due to the changed behavior, the fix
is actually trivial: setting `submodule.<name>.branch` to `master`
will reinstate the old behavior.
Helped-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Johannes Schindelin committedJun 24, 2020 at 14:46 UTCf0a96e8d4c98c2394dc726b57b914f95cbc7a0de
5 files changed+31-12
Documentation/git-submodule.txt
+6-6
index c9ed2bf3d5..7e5f995f77 100644--- a/Documentation/git-submodule.txt+++ b/Documentation/git-submodule.txt@@ -183,7 +183,7 @@ set-branch (-d|--default) [--] <path>:: Sets the default remote tracking branch for the submodule. The `--branch` option allows the remote branch to be specified. The `--default` option removes the submodule.<name>.branch configuration- key, which causes the tracking branch to default to 'master'.+ key, which causes the tracking branch to default to the remote 'HEAD'. set-url [--] <path> <newurl>:: Sets the URL of the specified submodule to <newurl>. Then, it will@@ -284,7 +284,7 @@ OPTIONS `.gitmodules` for `update --remote`. A special value of `.` is used to indicate that the name of the branch in the submodule should be the same name as the current branch in the current repository. If the- option is not specified, it defaults to 'master'.+ option is not specified, it defaults to the remote 'HEAD'. -f:: --force::@@ -322,10 +322,10 @@ OPTIONS the superproject's recorded SHA-1 to update the submodule, use the status of the submodule's remote-tracking branch. The remote used is branch's remote (`branch.<name>.remote`), defaulting to `origin`.- The remote branch used defaults to `master`, but the branch name may- be overridden by setting the `submodule.<name>.branch` option in- either `.gitmodules` or `.git/config` (with `.git/config` taking- precedence).+ The remote branch used defaults to the remote `HEAD`, but the branch+ name may be overridden by setting the `submodule.<name>.branch`+ option in either `.gitmodules` or `.git/config` (with `.git/config`+ taking precedence). + This works for any of the supported update procedures (`--checkout`, `--rebase`, etc.). The only change is the source of the target SHA-1.
Documentation/gitmodules.txt
+3-3
index 67275fd187..539b4e1997 100644--- a/Documentation/gitmodules.txt+++ b/Documentation/gitmodules.txt@@ -49,9 +49,9 @@ submodule.<name>.update:: submodule.<name>.branch:: A remote branch name for tracking updates in the upstream submodule.- If the option is not specified, it defaults to 'master'. A special- value of `.` is used to indicate that the name of the branch in the- submodule should be the same name as the current branch in the+ If the option is not specified, it defaults to the remote 'HEAD'.+ A special value of `.` is used to indicate that the name of the branch+ in the submodule should be the same name as the current branch in the current repository. See the `--remote` documentation in linkgit:git-submodule[1] for details.