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

Re: [PATCH, RFC] checkout: Attempt to checkout submodules

From
Junio C Hamano <gitster@pobox.com>
Date
Mar 19, 2015, 18:53 UTC
Message-ID
<xmqqy4msizu1.fsf@gitster.dls.corp.google.com>
In-Reply-To
<1426681643-7516-1-git-send-email-tbsaunde@tbsaunde.org>
Trevor Saunders <tbsaunde@tbsaunde.org> writes:
> If a user does git checkout HEAD -- path/to/submodule they'd expect the
> submodule to be checked out to the commit that submodule is at in HEAD.
Hmmm.

Is it a good idea to do that unconditionally by hard-coding the behaviour like this patch does?

Is it a good idea that hard-coded behaviour is "checkout [-f]"?

I think "git submodule update" is the command people use when they want to "match" the working trees of submodules, and via the configuration mechanism submodule.*.update, people can choose what they mean by "match"ing. Some people want to checkout the commit specified in the superproject tree by detaching HEAD at it. Some people want to integrate by merging or rebasing.

Show 51 quoted lines
> This is the most brute force possible way of try to do that, and so its
> probably broken in some cases.  However I'm not terribly familiar with
> git's internals and I'm not sure if this is even wanted so I'm starting
> simple.  If people want this to work I can try and do something better.
>
> Signed-off-by: Trevor Saunders <tbsaunde@tbsaunde.org>
> ---
>  entry.c | 22 ++++++++++++++++++++--
>  1 file changed, 20 insertions(+), 2 deletions(-)
>
> diff --git a/entry.c b/entry.c
> index 1eda8e9..2dbf5b9 100644
> --- a/entry.c
> +++ b/entry.c
> @@ -1,6 +1,8 @@
>  #include "cache.h"
> +#include "argv-array.h"
>  #include "blob.h"
>  #include "dir.h"
> +#include "run-command.h"
>  #include "streaming.h"
>  
>  static void create_directories(const char *path, int path_len,
> @@ -277,9 +279,25 @@ int checkout_entry(struct cache_entry *ce,
>  		 * just do the right thing)
>  		 */
>  		if (S_ISDIR(st.st_mode)) {
> -			/* If it is a gitlink, leave it alone! */
> -			if (S_ISGITLINK(ce->ce_mode))
> +			if (S_ISGITLINK(ce->ce_mode)) {
> +				struct argv_array args = ARGV_ARRAY_INIT;
> +				char sha1[41];
> +
> +				argv_array_push(&args, "checkout");
> +
> +				if (state->force)
> +					argv_array_push(&args, "-f");
> +
> +				memcpy(sha1, sha1_to_hex(ce->sha1), 41);
> +				argv_array_push(&args, sha1);
> +				
> +				run_command_v_opt_cd_env(args.argv,
> +					       		 RUN_GIT_CMD, ce->name,
> +							 NULL);
> +				argv_array_clear(&args);
> +
>  				return 0;
> +			}
>  			if (!state->force)
>  				return error("%s is a directory", path.buf);
>  			remove_subtree(&path);
Previous: Trevor SaundersNext: Trevor Saunders
Message 2 of 8 in “checkout: Attempt to checkout submodules”
  1. checkout: Attempt to checkout submodulesTrevor Saunders, Mar 18, 2015
  2. Junio C HamanoMar 19, 2015
  3. Trevor SaundersMar 19, 2015
  4. Junio C HamanoMar 19, 2015
  5. Trevor SaundersMar 20, 2015
  6. Jens LehmannMar 23, 2015
  7. Trevor SaundersMar 24, 2015
  8. Jens LehmannMar 25, 2015

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.