threads / patch / 31326

patchMake 'git submodule update --force' always check out submodules.

Subject: [PATCH] Make 'git submodule update --force' always check out submodules.

## tl;dr

3 messages between Jul 25, 2012 and Aug 23, 2012. Diffs are folded; open one to read it.

replies: 2people: 3as markdown or json

Stefan Zager· Jul 25, 2012, 17:41 UTC · lore

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>
---
 Documentation/git-submodule.txt |  9 ++++++++-
 git-submodule.sh                |  2 +-
 t/t7406-submodule-update.sh     | 12 ++++++++++++
 3 files changed, 21 insertions(+), 2 deletions(-)
Show changes to 3 files +21 −2

Documentation/git-submodule.txt, git-submodule.sh, t/t7406-submodule-update.sh

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
-- 
1.7.12.2.gf3df7bf.dirty
Junio C Hamano· Aug 23, 2012, 01:43 UTC · re: Stefan Zager · lore

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
Jens Lehmann· Aug 23, 2012, 18:51 UTC · re: Junio C Hamano · lore

Re: [PATCH] Make 'git submodule update --force' always check out submodules.

Am 23.08.2012 03:43, schrieb Junio C Hamano:
Show 12 quoted lines
> Stefan Zager <szager@google.com> writes:
> 
>> 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 ;-)
Yup, nicely done!

← back to recent threads