Skip to content

Commit

Permalink
git-common-dir: make "modules/" per-working-directory directory
Browse files Browse the repository at this point in the history
Each working directory of main repository has its own working directory
of submodule, and in most cases they should be checked out to different
revisions. So they should be separated.

It looks logical to make submodule instances in different working
directories to reuse the submodule directory in the common dir of
the main repository, and probably this is how "checkout --to" should
initialize them called on the main repository, but they also should work
fine being completely separated clones.

Testfile t7410-submodule-checkout-to.sh demostrates the behavior.

Signed-off-by: Max Kirillov <max@max630.net>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Max Kirillov authored and Junio C Hamano committed Dec 1, 2014
1 parent ee4fb84 commit df56607
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 4 deletions.
4 changes: 1 addition & 3 deletions Documentation/gitrepository-layout.txt
Original file line number Diff line number Diff line change
Expand Up @@ -248,9 +248,7 @@ commondir::
incomplete without the repository pointed by "commondir".

modules::
Contains the git-repositories of the submodules. This
directory is ignored if $GIT_COMMON_DIR is set and
"$GIT_COMMON_DIR/modules" will be used instead.
Contains the git-repositories of the submodules.

worktrees::
Contains worktree specific information of linked
Expand Down
2 changes: 1 addition & 1 deletion path.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ static void replace_dir(struct strbuf *buf, int len, const char *newdir)
}

static const char *common_list[] = {
"/branches", "/hooks", "/info", "!/logs", "/lost-found", "/modules",
"/branches", "/hooks", "/info", "!/logs", "/lost-found",
"/objects", "/refs", "/remotes", "/worktrees", "/rr-cache", "/svn",
"config", "!gc.pid", "packed-refs", "shallow",
NULL
Expand Down
50 changes: 50 additions & 0 deletions t/t7410-submodule-checkout-to.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#!/bin/sh

test_description='Combination of submodules and multiple workdirs'

. ./test-lib.sh

base_path=$(pwd -P)

test_expect_success 'setup: make origin' \
'mkdir -p origin/sub && ( cd origin/sub && git init &&
echo file1 >file1 &&
git add file1 &&
git commit -m file1 ) &&
mkdir -p origin/main && ( cd origin/main && git init &&
git submodule add ../sub &&
git commit -m "add sub" ) &&
( cd origin/sub &&
echo file1updated >file1 &&
git add file1 &&
git commit -m "file1 updated" ) &&
( cd origin/main/sub && git pull ) &&
( cd origin/main &&
git add sub &&
git commit -m "sub updated" )'

test_expect_success 'setup: clone' \
'mkdir clone && ( cd clone &&
git clone --recursive "$base_path/origin/main")'

rev1_hash_main=$(git --git-dir=origin/main/.git show --pretty=format:%h -q "HEAD~1")
rev1_hash_sub=$(git --git-dir=origin/sub/.git show --pretty=format:%h -q "HEAD~1")

test_expect_success 'checkout main' \
'mkdir default_checkout &&
(cd clone/main &&
git checkout --to "$base_path/default_checkout/main" "$rev1_hash_main")'

test_expect_failure 'can see submodule diffs just after checkout' \
'(cd default_checkout/main && git diff --submodule master"^!" | grep "file1 updated")'

test_expect_success 'checkout main and initialize independed clones' \
'mkdir fully_cloned_submodule &&
(cd clone/main &&
git checkout --to "$base_path/fully_cloned_submodule/main" "$rev1_hash_main") &&
(cd fully_cloned_submodule/main && git submodule update)'

test_expect_success 'can see submodule diffs after independed cloning' \
'(cd fully_cloned_submodule/main && git diff --submodule master"^!" | grep "file1 updated")'

test_done

0 comments on commit df56607

Please sign in to comment.