Skip to content

Commit

Permalink
clone: support atomic operation with --separate-git-dir
Browse files Browse the repository at this point in the history
Since b57fb80 (init, clone: support --separate-git-dir for .git file)
git clone supports the --separate-git-dir option to create the git dir
outside the work tree. But when that option is used, the git dir won't be
deleted in case the clone fails like it would be without this option. This
makes clone lose its atomicity as in case of a failure a partly set up git
dir is left behind. A real world example where this leads to problems is
when "git submodule update" fails to clone a submodule and later calls to
"git submodule update" stumble over the partially set up git dir and try
to revive the submodule from there, which then fails with a not very user
friendly error message.

Fix that by updating the junk_git_dir variable (used to remember if and
what git dir should be removed in case of failure) to the new value given
with the --seperate-git-dir option. Also add a test for this to t5600 (and
while at it fix the former last test to not cd into a directory to test
for its existence but use "test -d" instead).

Reported-by: Manlio Perillo <manlio.perillo@gmail.com>
Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jens Lehmann authored and Junio C Hamano committed Jan 6, 2013
1 parent b57fb80 commit 9be1980
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 2 deletions.
4 changes: 3 additions & 1 deletion builtin/clone.c
Original file line number Diff line number Diff line change
Expand Up @@ -471,8 +471,10 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
die("could not create leading directories of '%s'", git_dir);

set_git_dir_init(git_dir, real_git_dir, 0);
if (real_git_dir)
if (real_git_dir) {
git_dir = real_git_dir;
junk_git_dir = real_git_dir;
}

if (0 <= option_verbosity)
printf("Cloning into %s%s...\n",
Expand Down
12 changes: 11 additions & 1 deletion t/t5600-clone-fail-cleanup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,16 @@ test_expect_success \

test_expect_success \
'successful clone must leave the directory' \
'cd bar'
'test -d bar'

test_expect_success 'failed clone --separate-git-dir should not leave any directories' '
mkdir foo/.git/objects.bak/ &&
mv foo/.git/objects/* foo/.git/objects.bak/ &&
test_must_fail git clone --separate-git-dir gitdir foo worktree &&
test_must_fail test -e gitdir &&
test_must_fail test -e worktree &&
mv foo/.git/objects.bak/* foo/.git/objects/ &&
rmdir foo/.git/objects.bak
'

test_done

0 comments on commit 9be1980

Please sign in to comment.