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

Re: [PATCH] Solve git-submodule issues with detached work trees

From
Junio C Hamano <gitster@pobox.com>
Date
Jul 23, 2012, 05:09 UTC
Message-ID
<7vsjcjnjvj.fsf@alter.siamese.dyndns.org>
In-Reply-To
<CAHCkQtNfz8Kbn810LgXEQ_rkyk4qn5amGgHQsv2uR6H38sTSrg@mail.gmail.com>
Daniel Graña <dangra@gmail.com> writes:
Show 21 quoted lines
> A common way to track dotfiles with git is using GIT_DIR and
> GIT_WORK_TREE to move repository out of ~/.git with something like:
>
>     git init --bare ~/.dotfiles
>     alias dotfiles="GIT_DIR=~/.dotfiles GIT_WORK_TREE=~ git"
>
>     dotfiles add ~/.bashrc
>     dotfiles commit -a -m "add my bashrc"
>     ...
>
> but git-submodule complains when trying to add submodules:
>
>     dotfiles submodule add http://path.to/submodule
>     fatal: working tree '/home/user' already exists.
>
>     git --git-dir ~/.dotfiles submodule add http://path.to/submodule
>     fatal: /usr/lib/git-core/git-submodule cannot be used without a
> working tree.
>
> Signed-off-by: Daniel Graña <dangra@gmail.com>
> ---

I think this is in line with what we discussed earlier on list when the interaction between GIT_DIR/GIT_WORK_TREE and submodules came up the last time. Jens?

Show 22 quoted lines
>  git-submodule.sh                       |    7 +++-
>  t/t7409-submodule-detached-worktree.sh |   61 ++++++++++++++++++++++++++++++++
>  2 files changed, 66 insertions(+), 2 deletions(-)
>  create mode 100755 t/t7409-submodule-detached-worktree.sh
>
> diff --git a/git-submodule.sh b/git-submodule.sh
> index 5629d87..88ee4ea 100755
> --- a/git-submodule.sh
> +++ b/git-submodule.sh
> @@ -181,8 +181,11 @@ module_clone()
>  		rm -f "$gitdir/index"
>  	else
>  		mkdir -p "$gitdir_base"
> -		git clone $quiet -n ${reference:+"$reference"} \
> -			--separate-git-dir "$gitdir" "$url" "$sm_path" ||
> +		(
> +			clear_local_git_env
> +			git clone $quiet -n ${reference:+"$reference"} \
> +				--separate-git-dir "$gitdir" "$url" "$sm_path"
> +		) ||
>  		die "$(eval_gettext "Clone of '\$url' into submodule path
> '\$sm_path' failed")"
Line-wrapped broken patch?
Show 18 quoted lines
>  	fi
>
> diff --git a/t/t7409-submodule-detached-worktree.sh
> b/t/t7409-submodule-detached-worktree.sh
> new file mode 100755
> index 0000000..db75642
> --- /dev/null
> +++ b/t/t7409-submodule-detached-worktree.sh
> @@ -0,0 +1,61 @@
> +#!/bin/sh
> +#
> +# Copyright (c) 2012 Daniel Graña
> +#
> +
> +test_description='Test submodules on detached working tree
> +
> +This test verifies that "git submodule" initialization, update and
> addition works
Line-wrapped broken patch?
Show 19 quoted lines
> +on detahced working trees
> +'
> +
> +TEST_NO_CREATE_REPO=1
> +. ./test-lib.sh
> +
> +test_expect_success 'submodule on detached working tree' '
> +	git init --bare remote &&
> +	test_create_repo bundle1 &&
> +	(cd bundle1 && test_commit "shoot") &&
> +	mkdir home &&
> +	(
> +		cd home &&
> +		export GIT_WORK_TREE="$(pwd)" GIT_DIR="$(pwd)/.dotfiles" &&
> +		git clone --bare ../remote .dotfiles &&
> +		git submodule add ../bundle1 .vim/bundle/sogood &&
> +		test_commit "sogood" &&
> +		git push origin master
> +	) &&

Don't you want to verify not just commands succeed, but leave a reasonable result, e.g. by running "git rev-parse HEAD" in "remote" and comparing the output with "git rev-parse HEAD" in .dotfiles, or something?

Show 6 quoted lines
> +	mkdir home2 &&
> +	(
> +		cd home2 &&
> +		export GIT_WORK_TREE="$(pwd)" GIT_DIR="$(pwd)/.dotfiles" &&
> +		git clone --bare ../remote .dotfiles &&
> +		git submodule update --init

Likewise. What state, other than "submodule update --init" does not barf, do you expect to see?

Show 14 quoted lines
> +	)
> +'
> +
> +test_expect_success 'submodule on detached working pointed by core.worktree' '
> +	mkdir home3 &&
> +	(
> +		cd home3 &&
> +		export GIT_DIR="$(pwd)/.dotfiles" &&
> +		git clone --bare ../remote "$GIT_DIR" &&
> +		git config core.bare false &&
> +		git config core.worktree .. &&
> +		git submodule add ../bundle1 .vim/bundle/dupe &&
> +		test_commit "dupe" &&
> +		git push origin master
Likewise.
Show 10 quoted lines
> +	) &&
> +	(
> +		cd home &&
> +		export GIT_DIR="$(pwd)/.dotfiles" &&
> +		git config core.bare false &&
> +		git config core.worktree .. &&
> +		git pull &&
> +		git submodule update &&
> +		git submodule status &&
> +		test -d .vim/bundle/dupe

Likewise. Is there something you want to verify in the branches in the submodule and its working tree, other than the existence of that directory?

> +	)
> +'
> +
> +test_done
Previous: Daniel GrañaNext: Jens Lehmann
Message 2 of 11 in “Solve git-submodule issues with detached work trees”
  1. Solve git-submodule issues with detached work treesDaniel Graña, Jul 22, 2012
  2. Junio C HamanoJul 23, 2012
  3. Jens LehmannJul 23, 2012
  4. Junio C HamanoJul 23, 2012
  5. Jens LehmannJul 23, 2012
  6. Junio C HamanoJul 23, 2012
  7. Jens LehmannJul 23, 2012
  8. Junio C HamanoJul 23, 2012
  9. Daniel GrañaJul 23, 2012
  10. Richard HartmannJul 23, 2012
  11. Richard HartmannJul 23, 2012

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.