Re: [PATCH] Make 'git submodule update --force' always check out submodules.
Stefan Zager <szager@google.com> writes:
Show 8 quoted lines
> Currently, it will only do a checkout if the sha1 registered in the containing
> repository doesn't match the HEAD of the submodule, regardless of whether the
> submodule is dirty. As discussed on the mailing list, the '--force' flag is a
> strong indicator that the state of the submodule is suspect, and should be reset
> to HEAD.
>
> Signed-off-by: Stefan Zager <szager@google.com>
> ---
Thanks for a reroll. Will queue; looking good ;-)
Show 68 quoted lines
> Documentation/git-submodule.txt | 9 ++++++++-
> git-submodule.sh | 2 +-
> t/t7406-submodule-update.sh | 12 ++++++++++++
> 3 files changed, 21 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
> index fbbbcb2..2de7bf0 100644
> --- a/Documentation/git-submodule.txt
> +++ b/Documentation/git-submodule.txt
> @@ -149,6 +149,11 @@ submodule with the `--init` option.
> +
> If `--recursive` is specified, this command will recurse into the
> 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::
> Show commit summary between the given commit (defaults to HEAD) and
> @@ -210,7 +215,9 @@ OPTIONS
> This option is only valid for add and update commands.
> When running add, allow adding an otherwise ignored submodule path.
> When running update, throw away local changes in submodules when
> - switching to a different commit.
> + switching to a different commit; and always run a checkout operation
> + in the submodule, even if the commit listed in the index of the
> + containing repository matches the commit checked out in the submodule.
>
> --cached::
> This option is only valid for status and summary commands. These
> diff --git a/git-submodule.sh b/git-submodule.sh
> index aac575e..3aa7644 100755
> --- a/git-submodule.sh
> +++ b/git-submodule.sh
> @@ -578,7 +578,7 @@ Maybe you want to use 'update --init'?")"
> die "$(eval_gettext "Unable to find current revision in submodule path '\$sm_path'")"
> fi
>
> - if test "$subsha1" != "$sha1"
> + if test "$subsha1" != "$sha1" -o -n "$force"
> then
> subforce=$force
> # If we don't already have a -f flag and the submodule has never been checked out
> diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh
> index ce61d4c..9706436 100755
> --- a/t/t7406-submodule-update.sh
> +++ b/t/t7406-submodule-update.sh
> @@ -123,6 +123,18 @@ test_expect_success 'submodule update should throw away changes with --force ' '
> )
> '
>
> +test_expect_success 'submodule update --force forcibly checks out submodules' '
> + (cd super &&
> + (cd submodule &&
> + rm -f file
> + ) &&
> + git submodule update --force submodule &&
> + (cd submodule &&
> + test "$(git status -s file)" = ""
> + )
> + )
> +'
> +
> test_expect_success 'submodule update --rebase staying on master' '
> (cd super/submodule &&
> git checkout master