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

[PATCH 34/34] git-common-dir: make "modules/" per-working-directory directory

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Nov 30, 2014, 08:24 UTC
Message-ID
<1417335899-27307-35-git-send-email-pclouds@gmail.com>
In-Reply-To
<1417335899-27307-1-git-send-email-pclouds@gmail.com>
From: Max Kirillov <max@max630.net>

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>
---
 Documentation/gitrepository-layout.txt    |  4 +--
 path.c                                    |  2 +-
 t/t7410-submodule-checkout-to.sh (new +x) | 50 +++++++++++++++++++++++++++++++
 3 files changed, 52 insertions(+), 4 deletions(-)
 create mode 100755 t/t7410-submodule-checkout-to.sh
diff --git a/Documentation/gitrepository-layout.txt b/Documentation/gitrepository-layout.txt
index 2b30a92..7173b38 100644
--- a/Documentation/gitrepository-layout.txt
+++ b/Documentation/gitrepository-layout.txt
@@ -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
diff --git a/path.c b/path.c
index 35d498e..a5c51a3 100644
--- a/path.c
+++ b/path.c
@@ -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
diff --git a/t/t7410-submodule-checkout-to.sh b/t/t7410-submodule-checkout-to.sh
new file mode 100755
index 0000000..8f30aed
--- /dev/null
+++ b/t/t7410-submodule-checkout-to.sh
@@ -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
-- 
2.1.0.rc0.78.gc0d8480
Previous: Nguyễn Thái Ngọc Duy
Message 45 of 45 in “nd/multiple-work-trees reroll”
  1. 00/34 nd/multiple-work-trees rerollNguyễn Thái Ngọc Duy, Nov 30, 2014
  2. 01/34 path.c: make get_pathname() return strbuf instead of static bufferNguyễn Thái Ngọc Duy, Nov 30, 2014
  3. 02/34 path.c: make get_pathname() call sites return const char *Nguyễn Thái Ngọc Duy, Nov 30, 2014
  4. 03/34 git_snpath(): retire and replace with strbuf_git_path()Nguyễn Thái Ngọc Duy, Nov 30, 2014
  5. 04/34 path.c: rename vsnpath() to do_git_path()Nguyễn Thái Ngọc Duy, Nov 30, 2014
  6. 05/34 path.c: group git_path(), git_pathdup() and strbuf_git_path() togetherNguyễn Thái Ngọc Duy, Nov 30, 2014
  7. 06/34 git_path(): be aware of file relocation in $GIT_DIRNguyễn Thái Ngọc Duy, Nov 30, 2014
  8. 07/34 *.sh: respect $GIT_INDEX_FILENguyễn Thái Ngọc Duy, Nov 30, 2014
  9. 08/34 reflog: avoid constructing .lock path with git_pathNguyễn Thái Ngọc Duy, Nov 30, 2014
  10. 09/34 fast-import: use git_path() for accessing .git dir instead of get_git_dir()Nguyễn Thái Ngọc Duy, Nov 30, 2014
  11. 10/34 commit: use SEQ_DIR instead of hardcoding "sequencer"Nguyễn Thái Ngọc Duy, Nov 30, 2014
  12. 11/34 $GIT_COMMON_DIR: a new environment variableNguyễn Thái Ngọc Duy, Nov 30, 2014
  13. 12/34 git-sh-setup.sh: use rev-parse --git-path to get $GIT_DIR/objectsNguyễn Thái Ngọc Duy, Nov 30, 2014
  14. 13/34 *.sh: avoid hardcoding $GIT_DIR/hooks/...Nguyễn Thái Ngọc Duy, Nov 30, 2014
  15. 14/34 git-stash: avoid hardcoding $GIT_DIR/logs/....Nguyễn Thái Ngọc Duy, Nov 30, 2014
  16. 15/34 setup.c: convert is_git_directory() to use strbufNguyễn Thái Ngọc Duy, Nov 30, 2014
  17. 16/34 setup.c: detect $GIT_COMMON_DIR in is_git_directory()Nguyễn Thái Ngọc Duy, Nov 30, 2014
  18. 17/34 setup.c: convert check_repository_format_gently to use strbufNguyễn Thái Ngọc Duy, Nov 30, 2014
  19. 18/34 setup.c: detect $GIT_COMMON_DIR check_repository_format_gently()Nguyễn Thái Ngọc Duy, Nov 30, 2014
  20. 19/34 setup.c: support multi-checkout repo setupNguyễn Thái Ngọc Duy, Nov 30, 2014
  21. 20/34 wrapper.c: wrapper to open a file, fprintf then closeNguyễn Thái Ngọc Duy, Nov 30, 2014
  22. 21/34 use new wrapper write_file() for simple file writingNguyễn Thái Ngọc Duy, Nov 30, 2014
  23. 22/34 checkout: support checking out into a new working directoryNguyễn Thái Ngọc Duy, Nov 30, 2014
  24. 23/34 prune: strategies for linked checkoutsNguyễn Thái Ngọc Duy, Nov 30, 2014
  25. 24/34 checkout: reject if the branch is already checked out elsewhereNguyễn Thái Ngọc Duy, Nov 30, 2014
  26. Mark LevedahlNov 30, 2014
  27. Duy NguyenDec 1, 2014
  28. Junio C HamanoDec 1, 2014
  29. Mark LevedahlDec 2, 2014
  30. Duy NguyenDec 2, 2014
  31. Junio C HamanoDec 2, 2014
  32. Mark LevedahlDec 3, 2014
  33. Duy NguyenDec 3, 2014
  34. Junio C HamanoDec 3, 2014
  35. Duy NguyenDec 2, 2014
  36. 25/34 checkout: clean up half-prepared directories in --to modeNguyễn Thái Ngọc Duy, Nov 30, 2014
  37. 26/34 gc: style change -- no SP before closing parenthesisNguyễn Thái Ngọc Duy, Nov 30, 2014
  38. 27/34 gc: factor out gc.pruneexpire parsing codeNguyễn Thái Ngọc Duy, Nov 30, 2014
  39. 28/34 gc: support prune --worktreesNguyễn Thái Ngọc Duy, Nov 30, 2014
  40. 29/34 count-objects: report unused files in $GIT_DIR/worktrees/...Nguyễn Thái Ngọc Duy, Nov 30, 2014
  41. 30/34 git_path(): keep "info/sparse-checkout" per work-treeNguyễn Thái Ngọc Duy, Nov 30, 2014
  42. 31/34 checkout: don't require a work tree when checking out into a new oneNguyễn Thái Ngọc Duy, Nov 30, 2014
  43. 32/34 t2025: add a test to make sure grafts is working from a linked checkoutNguyễn Thái Ngọc Duy, Nov 30, 2014
  44. 33/34 checkout: do not fail if target is an empty directoryNguyễn Thái Ngọc Duy, Nov 30, 2014
  45. 34/34 git-common-dir: make "modules/" per-working-directory directoryNguyễn Thái Ngọc Duy, Nov 30, 2014

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.