git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 1/7] fetch/pull: recurse into submodules when necessary

From
Marc Branchaud <marcnarc@xiplink.com>
Date
Mar 2, 2011, 15:42 UTC
Message-ID
<4D6E6583.8090202@xiplink.com>
In-Reply-To
<4D6D7AB2.4010509@web.de>
On 11-03-01 06:01 PM, Jens Lehmann wrote:
Show 63 quoted lines
> To be able to access all commits of populated submodules referenced by the
> superproject it is sufficient to only then let "git fetch" recurse into a
> submodule when the new commits fetched in the superproject record new
> commits for it. Having these commits present is extremely useful when
> using the "--submodule" option to "git diff" (which is what "git gui" and
> "gitk" do since 1.6.6), as all submodule commits needed for creating a
> descriptive output can be accessed. Also merging submodule commits (added
> in 1.7.3) depends on the submodule commits in question being present to
> work. Last but not least this enables disconnected operation when using
> submodules, as all commits necessary for a successful "git submodule
> update -N" will have been fetched automatically. So we choose this mode as
> the default for fetch and pull.
> 
> Before a new or changed ref from upstream is updated in update_local_ref()
> "git rev-list <new-sha1> --not --branches --remotes" is used to determine
> all newly fetched commits. These are then walked and diffed against their
> parent(s) to see if a submodule has been changed. If that is the case, its
> path is stored to be fetched after the superproject fetch is completed.
> 
> Using the "--recurse-submodules" or the "--no-recurse-submodules" option
> disables the examination of the fetched refs because the result will be
> ignored anyway.
> 
> There is currently no infrastructure for storing deleted and new
> submodules in the .git directory of the superproject. Thats why fetch and
> pull for now only fetch submodules that are already checked out and are
> not renamed.
> 
> In t7403 the "--no-recurse-submodules" argument had to be added to "git
> pull" to avoid failure because of the moved upstream submodule repo.
> 
> Thanks-to: Jonathan Nieder <jrnieder@gmail.com>
> Thanks-to: Heiko Voigt <hvoigt@hvoigt.net>
> Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
> ---
>  Documentation/fetch-options.txt |   11 ++++
>  builtin/fetch.c                 |   25 ++++++---
>  submodule.c                     |  106 +++++++++++++++++++++++++++++++++++---
>  submodule.h                     |    9 +++
>  t/t5526-fetch-submodules.sh     |  109 +++++++++++++++++++++++++++++++++++++++
>  t/t7403-submodule-sync.sh       |    2 +-
>  6 files changed, 245 insertions(+), 17 deletions(-)
> 
> diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt
> index f37276e..ae22f75 100644
> --- a/Documentation/fetch-options.txt
> +++ b/Documentation/fetch-options.txt
> @@ -73,6 +73,17 @@ ifndef::git-pull[]
>  	Prepend <path> to paths printed in informative messages
>  	such as "Fetching submodule foo".  This option is used
>  	internally when recursing over submodules.
> +
> +--submodule-default=[yes|on-demand]::
> +	This option is used internally to set the submodule recursion default
> +	to either a boolean configuration value representing "true" (for
> +	unconditonal recursion) or to "on-demand" (when only those submodules
> +	should be fetched of which new commits have been fetched in its
> +	superproject).
> +	This option will be overridden by the 'fetch.recurseSubmodules' and
> +	'submodule.<name>.fetchRecurseSubmodules' settings in
> +	linkgit:gitmodules[5] and linkgit:git-config[1] while all of them
> +	are ignored when the "--[no-]recurse-submodules" option is given.
>  endif::git-pull[]
Rolling out the bike...
I think the option name and it's explanation need to be a little clearer:
--recurse-submodules-default=[yes|on-demand]::
	This option is used internally to temporarily provide a
	non-negative default value for the --recurse-submodules
	option.  All other methods of configuring fetch's submodule
	recursion (such as settings in linkgit:gitmodules[5] and
	linkgit:git-config[1]) override this option, as does
	specifying --[no-]recurse-submodules directly.
		M.
Previous: Jens LehmannNext: Jens Lehmann
Message 3 of 16 in “Teach fetch/pull the on-demand mode and make it the default”
  1. 0/7 Teach fetch/pull the on-demand mode and make it the defaultJens Lehmann, Mar 1, 2011
  2. 1/7 fetch/pull: recurse into submodules when necessaryJens Lehmann, Mar 1, 2011
  3. Marc BranchaudMar 2, 2011
  4. 2/7 fetch/pull: Add the 'on-demand' value to the --recurse-submodules optionJens Lehmann, Mar 1, 2011
  5. Marc BranchaudMar 2, 2011
  6. Marc BranchaudMar 2, 2011
  7. 3/7 config: teach the fetch.recurseSubmodules option the 'on-demand' valueJens Lehmann, Mar 1, 2011
  8. Marc BranchaudMar 2, 2011
  9. 4/7 Submodules: Add 'on-demand' value for the 'fetchRecurseSubmodule' optionJens Lehmann, Mar 1, 2011
  10. 5/7 fetch/pull: Don't recurse into a submodule when commits are already presentJens Lehmann, Mar 1, 2011
  11. Marc BranchaudMar 2, 2011
  12. 6/7 submodule update: Don't fetch when the submodule commit is already presentJens Lehmann, Mar 1, 2011
  13. 7/7 fetch/pull: Describe --recurse-submodule restrictions in the BUGS sectionJens Lehmann, Mar 1, 2011
  14. Jens LehmannMar 2, 2011
  15. Marc BranchaudMar 2, 2011
  16. Jens LehmannMar 2, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.