git-submodule: work with GIT_DIR/GIT_WORK_TREE
The combination of GIT_DIR and GIT_WORK_TREE can be used to manage files in one directory hierarchy while keeping the repository that keeps track of them outside the directory hierarchy. For example: git init --bare /path/to/there alias dotfiles="GIT_DIR=/path/to/there GIT_WORK_TREE=/path/to/here git" cd /path/to/here dotfiles add file dotfiles commit -a -m "add /path/to/here/file" ... lets you manage files under /path/to/here/ in the repository located at /path/to/there. git-submodule however fails to add submodules, as it is confused by GIT_DIR and GIT_WORK_TREE environment variables when it tries to work in the submodule, like so: dotfiles submodule add http://path.to/submodule fatal: working tree '/path/to/here' already exists. Simply unsetting the environment where the command works on the submodule is sufficient to fix this, as it has set things up so that GIT_DIR and GIT_WORK_TREE do not even have to point at the repository and the working tree of the submodule. Signed-off-by: Daniel Graña <dangra@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
476109fa4c
commit
be8779f7ac
@ -181,8 +181,11 @@ module_clone()
|
|||||||
rm -f "$gitdir/index"
|
rm -f "$gitdir/index"
|
||||||
else
|
else
|
||||||
mkdir -p "$gitdir_base"
|
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")"
|
die "$(eval_gettext "Clone of '\$url' into submodule path '\$sm_path' failed")"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
61
t/t7409-submodule-detached-worktree.sh
Normal file
61
t/t7409-submodule-detached-worktree.sh
Normal file
@ -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
|
||||||
|
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
|
||||||
|
) &&
|
||||||
|
mkdir home2 &&
|
||||||
|
(
|
||||||
|
cd home2 &&
|
||||||
|
export GIT_WORK_TREE="$(pwd)" GIT_DIR="$(pwd)/.dotfiles" &&
|
||||||
|
git clone --bare ../remote .dotfiles &&
|
||||||
|
git submodule update --init
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
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
|
||||||
|
) &&
|
||||||
|
(
|
||||||
|
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
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
test_done
|
Loading…
Reference in New Issue
Block a user