submodule: improve documentation of update subcommand

The documentation of 'git submodule update' has several problems:

1) It mentions that value 'none' of submodule.$name.update can be
   overridden by --checkout, but other combinations of configuration
   values and command line options are not mentioned.

2) The documentation of submodule.$name.update is scattered across three
   places, which is confusing.

3) The documentation of submodule.$name.update in gitmodules.txt is
   incorrect, because the code always uses the value from .git/config
   and never from .gitmodules.

4) Documentation of --force was incomplete, because it is only effective
   in case of checkout method of update.

Fix all these problems by documenting submodule.*.update in
git-submodule.txt and make everybody else refer to it.

Helped-by: Junio C Hamano <gitster@pobox.com>
Helped-by: Jens Lehmann <Jens.Lehmann@web.de>
Signed-off-by: Michal Sojka <sojkam1@fel.cvut.cz>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Michal Sojka 2015-03-02 23:57:58 +01:00 committed by Junio C Hamano
parent 76f8611a5f
commit 5c31acfbe2
3 changed files with 64 additions and 37 deletions

View File

@ -2303,12 +2303,16 @@ status.submodulesummary::
submodule.<name>.path:: submodule.<name>.path::
submodule.<name>.url:: submodule.<name>.url::
The path within this project and URL for a submodule. These
variables are initially populated by 'git submodule init'. See
linkgit:git-submodule[1] and linkgit:gitmodules[5] for
details.
submodule.<name>.update:: submodule.<name>.update::
The path within this project, URL, and the updating strategy The default update procedure for a submodule. This variable
for a submodule. These variables are initially populated is populated by `git submodule init` from the
by 'git submodule init'; edit them to override the linkgit:gitmodules[5] file. See description of 'update'
URL and other values found in the `.gitmodules` file. See command in linkgit:git-submodule[1].
linkgit:git-submodule[1] and linkgit:gitmodules[5] for details.
submodule.<name>.branch:: submodule.<name>.branch::
The remote branch name for a submodule, used by `git submodule The remote branch name for a submodule, used by `git submodule

View File

@ -154,27 +154,51 @@ If `--force` is specified, the submodule's work tree will be removed even if
it contains local modifications. it contains local modifications.
update:: update::
Update the registered submodules, i.e. clone missing submodules and
checkout the commit specified in the index of the containing repository.
This will make the submodules HEAD be detached unless `--rebase` or
`--merge` is specified or the key `submodule.$name.update` is set to
`rebase`, `merge` or `none`. `none` can be overridden by specifying
`--checkout`. Setting the key `submodule.$name.update` to `!command`
will cause `command` to be run. `command` can be any arbitrary shell
command that takes a single argument, namely the sha1 to update to.
+ +
--
Update the registered submodules to match what the superproject
expects by cloning missing submodules and updating the working tree of
the submodules. The "updating" can be done in several ways depending
on command line options and the value of `submodule.<name>.update`
configuration variable. Supported update procedures are:
checkout;; the commit recorded in the superproject will be
checked out in the submodule on a detached HEAD. This is
done when `--checkout` option is given, or no option is
given, and `submodule.<name>.update` is unset, or if it is
set to 'checkout'.
+
If `--force` is specified, the submodule will be checked out (using
`git checkout --force` if appropriate), even if the commit specified
in the index of the containing repository already matches the commit
checked out in the submodule.
rebase;; the current branch of the submodule will be rebased
onto the commit recorded in the superproject. This is done
when `--rebase` option is given, or no option is given, and
`submodule.<name>.update` is set to 'rebase'.
merge;; the commit recorded in the superproject will be merged
into the current branch in the submodule. This is done
when `--merge` option is given, or no option is given, and
`submodule.<name>.update` is set to 'merge'.
custom command;; arbitrary shell command that takes a single
argument (the sha1 of the commit recorded in the
superproject) is executed. This is done when no option is
given, and `submodule.<name>.update` has the form of
'!command'.
When no option is given and `submodule.<name>.update` is set to 'none',
the submodule is not updated.
If the submodule is not yet initialized, and you just want to use the If the submodule is not yet initialized, and you just want to use the
setting as stored in .gitmodules, you can automatically initialize the setting as stored in .gitmodules, you can automatically initialize the
submodule with the `--init` option. submodule with the `--init` option.
+
If `--recursive` is specified, this command will recurse into the If `--recursive` is specified, this command will recurse into the
registered submodules, and update any nested submodules within. registered submodules, and update any nested submodules within.
+ --
If `--force` is specified, the submodule will be checked out (using
`git checkout --force` if appropriate), even if the commit specified in the
index of the containing repository already matches the commit checked out in
the submodule.
summary:: summary::
Show commit summary between the given commit (defaults to HEAD) and Show commit summary between the given commit (defaults to HEAD) and
working tree/index. For a submodule in question, a series of commits working tree/index. For a submodule in question, a series of commits
@ -238,10 +262,12 @@ OPTIONS
When running add, allow adding an otherwise ignored submodule path. When running add, allow adding an otherwise ignored submodule path.
When running deinit the submodule work trees will be removed even if When running deinit the submodule work trees will be removed even if
they contain local changes. they contain local changes.
When running update, throw away local changes in submodules when When running update (only effective with the checkout procedure),
switching to a different commit; and always run a checkout operation throw away local changes in submodules when switching to a
in the submodule, even if the commit listed in the index of the different commit; and always run a checkout operation in the
containing repository matches the commit checked out in the submodule. submodule, even if the commit listed in the index of the
containing repository matches the commit checked out in the
submodule.
--cached:: --cached::
This option is only valid for status and summary commands. These This option is only valid for status and summary commands. These
@ -302,7 +328,7 @@ the submodule itself.
Checkout the commit recorded in the superproject on a detached HEAD Checkout the commit recorded in the superproject on a detached HEAD
in the submodule. This is the default behavior, the main use of in the submodule. This is the default behavior, the main use of
this option is to override `submodule.$name.update` when set to this option is to override `submodule.$name.update` when set to
`merge`, `rebase` or `none`. a value other than `checkout`.
If the key `submodule.$name.update` is either not explicitly set or If the key `submodule.$name.update` is either not explicitly set or
set to `checkout`, this option is implicit. set to `checkout`, this option is implicit.

View File

@ -38,18 +38,15 @@ submodule.<name>.url::
In addition, there are a number of optional keys: In addition, there are a number of optional keys:
submodule.<name>.update:: submodule.<name>.update::
Defines what to do when the submodule is updated by the superproject. Defines the default update procedure for the named submodule,
If 'checkout' (the default), the new commit specified in the i.e. how the submodule is updated by "git submodule update"
superproject will be checked out in the submodule on a detached HEAD. command in the superproject. This is only used by `git
If 'rebase', the current branch of the submodule will be rebased onto submodule init` to initialize the configuration variable of
the commit specified in the superproject. If 'merge', the commit the same name. Allowed values here are 'checkout', 'rebase',
specified in the superproject will be merged into the current branch 'merge' or 'none'. See description of 'update' command in
in the submodule. linkgit:git-submodule[1] for their meaning. Note that the
If 'none', the submodule with name `$name` will not be updated '!command' form is intentionally ignored here for security
by default. reasons.
This config option is overridden if 'git submodule update' is given
the '--merge', '--rebase' or '--checkout' options.
submodule.<name>.branch:: submodule.<name>.branch::
A remote branch name for tracking updates in the upstream submodule. A remote branch name for tracking updates in the upstream submodule.