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

[PATCH v2 19/32] setup.c: support multi-checkout repo setup

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Sep 10, 2014, 22:41 UTC
Message-ID
<1410388928-32265-20-git-send-email-pclouds@gmail.com>
In-Reply-To
<1410388928-32265-1-git-send-email-pclouds@gmail.com>

The repo setup procedure is updated to detect $GIT_DIR/commondir and set $GIT_COMMON_DIR properly.

The core.worktree is ignored when $GIT_COMMON_DIR is set. This is because the config file is shared in multi-checkout setup, but checkout directories _are_ different. Making core.worktree effective in all checkouts mean it's back to a single checkout.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Documentation/config.txt        |  2 ++
 Documentation/git-rev-parse.txt |  3 ++
 builtin/rev-parse.c             |  4 +++
 cache.h                         |  1 +
 environment.c                   |  8 ++---
 setup.c                         | 33 +++++++++++++-----
 t/t1501-worktree.sh             | 76 +++++++++++++++++++++++++++++++++++++++++
 t/t1510-repo-setup.sh           |  1 +
 trace.c                         |  1 +
 9 files changed, 115 insertions(+), 14 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 1d718bd..286e539 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -380,6 +380,8 @@ false), while all other repositories are assumed to be bare (bare
 
 core.worktree::
 	Set the path to the root of the working tree.
+	If GIT_COMMON_DIR environment variable is set, core.worktree
+	is ignored and not used for determining the root of working tree.
 	This can be overridden by the GIT_WORK_TREE environment
 	variable and the '--work-tree' command-line option.
 	The value can be an absolute path or relative to the path to
diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt
index 9465399..f1867d3 100644
--- a/Documentation/git-rev-parse.txt
+++ b/Documentation/git-rev-parse.txt
@@ -215,6 +215,9 @@ If `$GIT_DIR` is not defined and the current directory
 is not detected to lie in a Git repository or work tree
 print a message to stderr and exit with nonzero status.
 
+--git-common-dir::
+	Show `$GIT_COMMON_DIR` if defined, else `$GIT_DIR`.
+
 --is-inside-git-dir::
 	When the current working directory is below the repository
 	directory print "true", otherwise "false".
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index 7606d43..29475c5 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -757,6 +757,10 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 				printf("%s%s.git\n", cwd, len && cwd[len-1] != '/' ? "/" : "");
 				continue;
 			}
+			if (!strcmp(arg, "--git-common-dir")) {
+				puts(get_git_common_dir());
+				continue;
+			}
 			if (!strcmp(arg, "--resolve-git-dir")) {
 				const char *gitdir = argv[++i];
 				if (!gitdir)
diff --git a/cache.h b/cache.h
index b606ee4..e3ff7dc 100644
--- a/cache.h
+++ b/cache.h
@@ -422,6 +422,7 @@ extern char *get_object_directory(void);
 extern char *get_index_file(void);
 extern char *get_graft_file(void);
 extern int set_git_dir(const char *path);
+extern int get_common_dir(struct strbuf *sb, const char *gitdir);
 extern const char *get_git_namespace(void);
 extern const char *strip_namespace(const char *namespaced_ref);
 extern const char *get_git_work_tree(void);
diff --git a/environment.c b/environment.c
index 78a07e4..d5b0788 100644
--- a/environment.c
+++ b/environment.c
@@ -141,6 +141,7 @@ static char *git_path_from_env(const char *envvar, const char *git_dir,
 
 static void setup_git_env(void)
 {
+	struct strbuf sb = STRBUF_INIT;
 	const char *gitfile;
 	const char *shallow_file;
 
@@ -149,12 +150,9 @@ static void setup_git_env(void)
 		git_dir = DEFAULT_GIT_DIR_ENVIRONMENT;
 	gitfile = read_gitfile(git_dir);
 	git_dir = xstrdup(gitfile ? gitfile : git_dir);
-	git_common_dir = getenv(GIT_COMMON_DIR_ENVIRONMENT);
-	if (git_common_dir) {
+	if (get_common_dir(&sb, git_dir))
 		git_common_dir_env = 1;
-		git_common_dir = xstrdup(git_common_dir);
-	} else
-		git_common_dir = git_dir;
+	git_common_dir = strbuf_detach(&sb, NULL);
 	git_object_dir = git_path_from_env(DB_ENVIRONMENT, git_common_dir,
 					   "objects", &git_db_env);
 	git_index_file = git_path_from_env(INDEX_ENVIRONMENT, git_dir,
diff --git a/setup.c b/setup.c
index 79f79f2..8f90bc3 100644
--- a/setup.c
+++ b/setup.c
@@ -224,14 +224,15 @@ void verify_non_filename(const char *prefix, const char *arg)
 	    "'git <command> [<revision>...] -- [<file>...]'", arg);
 }
 
-static void get_common_dir(struct strbuf *sb, const char *gitdir)
+int get_common_dir(struct strbuf *sb, const char *gitdir)
 {
 	struct strbuf data = STRBUF_INIT;
 	struct strbuf path = STRBUF_INIT;
 	const char *git_common_dir = getenv(GIT_COMMON_DIR_ENVIRONMENT);
+	int ret = 0;
 	if (git_common_dir) {
 		strbuf_addstr(sb, git_common_dir);
-		return;
+		return 1;
 	}
 	strbuf_addf(&path, "%s/commondir", gitdir);
 	if (file_exists(path.buf)) {
@@ -246,10 +247,12 @@ static void get_common_dir(struct strbuf *sb, const char *gitdir)
 			strbuf_addf(&path, "%s/", gitdir);
 		strbuf_addbuf(&path, &data);
 		strbuf_addstr(sb, real_path(path.buf));
+		ret = 1;
 	} else
 		strbuf_addstr(sb, gitdir);
 	strbuf_release(&data);
 	strbuf_release(&path);
+	return ret;
 }
 
 /*
@@ -340,13 +343,26 @@ void setup_work_tree(void)
 	initialized = 1;
 }
 
+static int check_repo_format(const char *var, const char *value, void *cb)
+{
+	if (strcmp(var, "core.repositoryformatversion") == 0)
+		repository_format_version = git_config_int(var, value);
+	else if (strcmp(var, "core.sharedrepository") == 0)
+		shared_repository = git_config_perm(var, value);
+	return 0;
+}
+
 static int check_repository_format_gently(const char *gitdir, int *nongit_ok)
 {
 	struct strbuf sb = STRBUF_INIT;
 	const char *repo_config;
+	config_fn_t fn;
 	int ret = 0;
 
-	get_common_dir(&sb, gitdir);
+	if (get_common_dir(&sb, gitdir))
+		fn = check_repo_format;
+	else
+		fn = check_repository_format_version;
 	strbuf_addstr(&sb, "/config");
 	repo_config = sb.buf;
 
@@ -359,7 +375,7 @@ static int check_repository_format_gently(const char *gitdir, int *nongit_ok)
 	 * Use a gentler version of git_config() to check if this repo
 	 * is a good one.
 	 */
-	git_config_early(check_repository_format_version, NULL, repo_config);
+	git_config_early(fn, NULL, repo_config);
 	if (GIT_REPO_VERSION < repository_format_version) {
 		if (!nongit_ok)
 			die ("Expected git repo version <= %d, found %d",
@@ -831,11 +847,10 @@ int git_config_perm(const char *var, const char *value)
 
 int check_repository_format_version(const char *var, const char *value, void *cb)
 {
-	if (strcmp(var, "core.repositoryformatversion") == 0)
-		repository_format_version = git_config_int(var, value);
-	else if (strcmp(var, "core.sharedrepository") == 0)
-		shared_repository = git_config_perm(var, value);
-	else if (strcmp(var, "core.bare") == 0) {
+	int ret = check_repo_format(var, value, cb);
+	if (ret)
+		return ret;
+	if (strcmp(var, "core.bare") == 0) {
 		is_bare_repository_cfg = git_config_bool(var, value);
 		if (is_bare_repository_cfg == 1)
 			inside_work_tree = -1;
diff --git a/t/t1501-worktree.sh b/t/t1501-worktree.sh
index 8f36aa9..e6ac7a4 100755
--- a/t/t1501-worktree.sh
+++ b/t/t1501-worktree.sh
@@ -346,4 +346,80 @@ test_expect_success 'relative $GIT_WORK_TREE and git subprocesses' '
 	test_cmp expected actual
 '
 
+test_expect_success 'Multi-worktree setup' '
+	mkdir work &&
+	mkdir -p repo.git/repos/foo &&
+	cp repo.git/HEAD repo.git/index repo.git/repos/foo &&
+	sane_unset GIT_DIR GIT_CONFIG GIT_WORK_TREE
+'
+
+test_expect_success 'GIT_DIR set (1)' '
+	echo "gitdir: repo.git/repos/foo" >gitfile &&
+	echo ../.. >repo.git/repos/foo/commondir &&
+	(
+		cd work &&
+		GIT_DIR=../gitfile git rev-parse --git-common-dir >actual &&
+		test-path-utils real_path "$TRASH_DIRECTORY/repo.git" >expect &&
+		test_cmp expect actual
+	)
+'
+
+test_expect_success 'GIT_DIR set (2)' '
+	echo "gitdir: repo.git/repos/foo" >gitfile &&
+	echo "$TRASH_DIRECTORY/repo.git" >repo.git/repos/foo/commondir &&
+	(
+		cd work &&
+		GIT_DIR=../gitfile git rev-parse --git-common-dir >actual &&
+		test-path-utils real_path "$TRASH_DIRECTORY/repo.git" >expect &&
+		test_cmp expect actual
+	)
+'
+
+test_expect_success 'Auto discovery' '
+	echo "gitdir: repo.git/repos/foo" >.git &&
+	echo ../.. >repo.git/repos/foo/commondir &&
+	(
+		cd work &&
+		git rev-parse --git-common-dir >actual &&
+		test-path-utils real_path "$TRASH_DIRECTORY/repo.git" >expect &&
+		test_cmp expect actual &&
+		echo haha >data1 &&
+		git add data1 &&
+		git ls-files --full-name :/ | grep data1 >actual &&
+		echo work/data1 >expect &&
+		test_cmp expect actual
+	)
+'
+
+test_expect_success '$GIT_DIR/common overrides core.worktree' '
+	mkdir elsewhere &&
+	git --git-dir=repo.git config core.worktree "$TRASH_DIRECTORY/elsewhere" &&
+	echo "gitdir: repo.git/repos/foo" >.git &&
+	echo ../.. >repo.git/repos/foo/commondir &&
+	(
+		cd work &&
+		git rev-parse --git-common-dir >actual &&
+		test-path-utils real_path "$TRASH_DIRECTORY/repo.git" >expect &&
+		test_cmp expect actual &&
+		echo haha >data2 &&
+		git add data2 &&
+		git ls-files --full-name :/ | grep data2 >actual &&
+		echo work/data2 >expect &&
+		test_cmp expect actual
+	)
+'
+
+test_expect_success '$GIT_WORK_TREE overrides $GIT_DIR/common' '
+	echo "gitdir: repo.git/repos/foo" >.git &&
+	echo ../.. >repo.git/repos/foo/commondir &&
+	(
+		cd work &&
+		echo haha >data3 &&
+		git --git-dir=../.git --work-tree=. add data3 &&
+		git ls-files --full-name -- :/ | grep data3 >actual &&
+		echo data3 >expect &&
+		test_cmp expect actual
+	)
+'
+
 test_done
diff --git a/t/t1510-repo-setup.sh b/t/t1510-repo-setup.sh
index e1b2a99..33c1a58 100755
--- a/t/t1510-repo-setup.sh
+++ b/t/t1510-repo-setup.sh
@@ -106,6 +106,7 @@ setup_env () {
 expect () {
 	cat >"$1/expected" <<-EOF
 	setup: git_dir: $2
+	setup: git_common_dir: $2
 	setup: worktree: $3
 	setup: cwd: $4
 	setup: prefix: $5
diff --git a/trace.c b/trace.c
index 08180a9..a594761 100644
--- a/trace.c
+++ b/trace.c
@@ -173,6 +173,7 @@ void trace_repo_setup(const char *prefix)
 		prefix = "(null)";
 
 	trace_printf_key(key, "setup: git_dir: %s\n", quote_crnl(get_git_dir()));
+	trace_printf_key(key, "setup: git_common_dir: %s\n", quote_crnl(get_git_common_dir()));
 	trace_printf_key(key, "setup: worktree: %s\n", quote_crnl(git_work_tree));
 	trace_printf_key(key, "setup: cwd: %s\n", quote_crnl(cwd));
 	trace_printf_key(key, "setup: prefix: %s\n", quote_crnl(prefix));
-- 
2.1.0.rc0.78.gc0d8480
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 68 of 134 in “nd/multiple-work-trees cleanup”
  1. 00/32 nd/multiple-work-trees cleanupNguyễn Thái Ngọc Duy, Aug 30, 2014
  2. 01/32 path.c: make get_pathname() return strbuf instead of static bufferNguyễn Thái Ngọc Duy, Aug 30, 2014
  3. 02/32 path.c: make get_pathname() call sites return const char *Nguyễn Thái Ngọc Duy, Aug 30, 2014
  4. 03/32 git_snpath(): retire and replace with strbuf_git_path()Nguyễn Thái Ngọc Duy, Aug 30, 2014
  5. 04/32 path.c: rename vsnpath() to do_git_path()Nguyễn Thái Ngọc Duy, Aug 30, 2014
  6. 05/32 path.c: group git_path(), git_pathdup() and strbuf_git_path() togetherNguyễn Thái Ngọc Duy, Aug 30, 2014
  7. 06/32 git_path(): be aware of file relocation in $GIT_DIRNguyễn Thái Ngọc Duy, Aug 30, 2014
  8. 07/32 *.sh: respect $GIT_INDEX_FILENguyễn Thái Ngọc Duy, Aug 30, 2014
  9. 08/32 reflog: avoid constructing .lock path with git_pathNguyễn Thái Ngọc Duy, Aug 30, 2014
  10. 09/32 fast-import: use git_path() for accessing .git dir instead of get_git_dir()Nguyễn Thái Ngọc Duy, Aug 30, 2014
  11. 10/32 commit: use SEQ_DIR instead of hardcoding "sequencer"Nguyễn Thái Ngọc Duy, Aug 30, 2014
  12. 11/32 $GIT_COMMON_DIR: a new environment variableNguyễn Thái Ngọc Duy, Aug 30, 2014
  13. 12/32 git-sh-setup.sh: use rev-parse --git-path to get $GIT_DIR/objectsNguyễn Thái Ngọc Duy, Aug 30, 2014
  14. 13/32 *.sh: avoid hardcoding $GIT_DIR/hooks/...Nguyễn Thái Ngọc Duy, Aug 30, 2014
  15. 14/32 git-stash: avoid hardcoding $GIT_DIR/logs/....Nguyễn Thái Ngọc Duy, Aug 30, 2014
  16. 15/32 setup.c: convert is_git_directory() to use strbufNguyễn Thái Ngọc Duy, Aug 30, 2014
  17. 16/32 setup.c: detect $GIT_COMMON_DIR in is_git_directory()Nguyễn Thái Ngọc Duy, Aug 30, 2014
  18. 17/32 setup.c: convert check_repository_format_gently to use strbufNguyễn Thái Ngọc Duy, Aug 30, 2014
  19. 18/32 setup.c: detect $GIT_COMMON_DIR check_repository_format_gently()Nguyễn Thái Ngọc Duy, Aug 30, 2014
  20. 19/32 setup.c: support multi-checkout repo setupNguyễn Thái Ngọc Duy, Aug 30, 2014
  21. 20/32 wrapper.c: wrapper to open a file, fprintf then closeNguyễn Thái Ngọc Duy, Aug 30, 2014
  22. 21/32 use new wrapper write_file() for simple file writingNguyễn Thái Ngọc Duy, Aug 30, 2014
  23. 22/32 checkout: support checking out into a new working directoryNguyễn Thái Ngọc Duy, Aug 30, 2014
  24. Philip OakleyAug 30, 2014
  25. Duy NguyenAug 31, 2014
  26. Duy NguyenAug 31, 2014
  27. Philip OakleyAug 31, 2014
  28. Duy NguyenSep 2, 2014
  29. Marc BranchaudSep 2, 2014
  30. Junio C HamanoSep 2, 2014
  31. Duy NguyenSep 4, 2014
  32. Duy NguyenSep 8, 2014
  33. Marc BranchaudSep 8, 2014
  34. Scott SchmitSep 5, 2014
  35. Duy NguyenSep 5, 2014
  36. 23/32 checkout: clean up half-prepared directories in --to modeNguyễn Thái Ngọc Duy, Aug 30, 2014
  37. 24/32 checkout: reject if the branch is already checked out elsewhereNguyễn Thái Ngọc Duy, Aug 30, 2014
  38. 25/32 prune: strategies for linked checkoutsNguyễn Thái Ngọc Duy, Aug 30, 2014
  39. 26/32 gc: style change -- no SP before closing parenthesisNguyễn Thái Ngọc Duy, Aug 30, 2014
  40. 27/32 gc: factor out gc.pruneexpire parsing codeNguyễn Thái Ngọc Duy, Aug 30, 2014
  41. 28/32 gc: support prune --reposNguyễn Thái Ngọc Duy, Aug 30, 2014
  42. 29/32 count-objects: report unused files in $GIT_DIR/repos/...Nguyễn Thái Ngọc Duy, Aug 30, 2014
  43. 30/32 git_path(): keep "info/sparse-checkout" per work-treeNguyễn Thái Ngọc Duy, Aug 30, 2014
  44. 31/32 checkout: don't require a work tree when checking out into a new oneNguyễn Thái Ngọc Duy, Aug 30, 2014
  45. 32/32 t2025: add a test to make sure grafts is working from a linked checkoutNguyễn Thái Ngọc Duy, Aug 30, 2014
  46. Eric SunshineAug 30, 2014
  47. Duy NguyenAug 30, 2014
  48. Junio C HamanoSep 2, 2014
  49. 00/32 nd/multiple-work-treesNguyễn Thái Ngọc Duy, Sep 10, 2014
  50. 01/32 path.c: make get_pathname() return strbuf instead of static bufferNguyễn Thái Ngọc Duy, Sep 10, 2014
  51. 02/32 path.c: make get_pathname() call sites return const char *Nguyễn Thái Ngọc Duy, Sep 10, 2014
  52. 03/32 git_snpath(): retire and replace with strbuf_git_path()Nguyễn Thái Ngọc Duy, Sep 10, 2014
  53. 04/32 path.c: rename vsnpath() to do_git_path()Nguyễn Thái Ngọc Duy, Sep 10, 2014
  54. 05/32 path.c: group git_path(), git_pathdup() and strbuf_git_path() togetherNguyễn Thái Ngọc Duy, Sep 10, 2014
  55. 06/32 git_path(): be aware of file relocation in $GIT_DIRNguyễn Thái Ngọc Duy, Sep 10, 2014
  56. 07/32 *.sh: respect $GIT_INDEX_FILENguyễn Thái Ngọc Duy, Sep 10, 2014
  57. 08/32 reflog: avoid constructing .lock path with git_pathNguyễn Thái Ngọc Duy, Sep 10, 2014
  58. 09/32 fast-import: use git_path() for accessing .git dir instead of get_git_dir()Nguyễn Thái Ngọc Duy, Sep 10, 2014
  59. 10/32 commit: use SEQ_DIR instead of hardcoding "sequencer"Nguyễn Thái Ngọc Duy, Sep 10, 2014
  60. 11/32 $GIT_COMMON_DIR: a new environment variableNguyễn Thái Ngọc Duy, Sep 10, 2014
  61. 12/32 git-sh-setup.sh: use rev-parse --git-path to get $GIT_DIR/objectsNguyễn Thái Ngọc Duy, Sep 10, 2014
  62. 13/32 *.sh: avoid hardcoding $GIT_DIR/hooks/...Nguyễn Thái Ngọc Duy, Sep 10, 2014
  63. 14/32 git-stash: avoid hardcoding $GIT_DIR/logs/....Nguyễn Thái Ngọc Duy, Sep 10, 2014
  64. 15/32 setup.c: convert is_git_directory() to use strbufNguyễn Thái Ngọc Duy, Sep 10, 2014
  65. 16/32 setup.c: detect $GIT_COMMON_DIR in is_git_directory()Nguyễn Thái Ngọc Duy, Sep 10, 2014
  66. 17/32 setup.c: convert check_repository_format_gently to use strbufNguyễn Thái Ngọc Duy, Sep 10, 2014
  67. 18/32 setup.c: detect $GIT_COMMON_DIR check_repository_format_gently()Nguyễn Thái Ngọc Duy, Sep 10, 2014
  68. 19/32 setup.c: support multi-checkout repo setupNguyễn Thái Ngọc Duy, Sep 10, 2014
  69. 20/32 wrapper.c: wrapper to open a file, fprintf then closeNguyễn Thái Ngọc Duy, Sep 10, 2014
  70. 21/32 use new wrapper write_file() for simple file writingNguyễn Thái Ngọc Duy, Sep 10, 2014
  71. 22/32 checkout: support checking out into a new working directoryNguyễn Thái Ngọc Duy, Sep 10, 2014
  72. Marc BranchaudSep 11, 2014
  73. Duy NguyenSep 21, 2014
  74. Eric SunshineSep 21, 2014
  75. Duy NguyenSep 21, 2014
  76. Marc BranchaudSep 22, 2014
  77. Eric SunshineSep 22, 2014
  78. 23/32 prune: strategies for linked checkoutsNguyễn Thái Ngọc Duy, Sep 10, 2014
  79. Marc BranchaudSep 11, 2014
  80. Eric SunshineSep 12, 2014
  81. Marc BranchaudSep 12, 2014
  82. Duy NguyenSep 21, 2014
  83. Eric SunshineSep 21, 2014
  84. Duy NguyenSep 21, 2014
  85. Marc BranchaudSep 22, 2014
  86. Eric SunshineSep 22, 2014
  87. 24/32 checkout: reject if the branch is already checked out elsewhereNguyễn Thái Ngọc Duy, Sep 10, 2014
  88. 25/32 checkout: clean up half-prepared directories in --to modeNguyễn Thái Ngọc Duy, Sep 10, 2014
  89. 26/32 gc: style change -- no SP before closing parenthesisNguyễn Thái Ngọc Duy, Sep 10, 2014
  90. 27/32 gc: factor out gc.pruneexpire parsing codeNguyễn Thái Ngọc Duy, Sep 10, 2014
  91. 28/32 gc: support prune --worktreesNguyễn Thái Ngọc Duy, Sep 10, 2014
  92. Duy NguyenSep 21, 2014
  93. Marc BranchaudSep 22, 2014
  94. 29/32 count-objects: report unused files in $GIT_DIR/worktrees/...Nguyễn Thái Ngọc Duy, Sep 10, 2014
  95. 30/32 git_path(): keep "info/sparse-checkout" per work-treeNguyễn Thái Ngọc Duy, Sep 10, 2014
  96. 31/32 checkout: don't require a work tree when checking out into a new oneNguyễn Thái Ngọc Duy, Sep 10, 2014
  97. 32/32 t2025: add a test to make sure grafts is working from a linked checkoutNguyễn Thái Ngọc Duy, Sep 10, 2014
  98. Junio C HamanoSep 25, 2014
  99. 00/32 nd/multiple-work-treesNguyễn Thái Ngọc Duy, Sep 28, 2014
  100. 01/32 path.c: make get_pathname() return strbuf instead of static bufferNguyễn Thái Ngọc Duy, Sep 28, 2014
  101. 02/32 path.c: make get_pathname() call sites return const char *Nguyễn Thái Ngọc Duy, Sep 28, 2014
  102. 03/32 git_snpath(): retire and replace with strbuf_git_path()Nguyễn Thái Ngọc Duy, Sep 28, 2014
  103. 04/32 path.c: rename vsnpath() to do_git_path()Nguyễn Thái Ngọc Duy, Sep 28, 2014
  104. 05/32 path.c: group git_path(), git_pathdup() and strbuf_git_path() togetherNguyễn Thái Ngọc Duy, Sep 28, 2014
  105. 06/32 git_path(): be aware of file relocation in $GIT_DIRNguyễn Thái Ngọc Duy, Sep 28, 2014
  106. 07/32 *.sh: respect $GIT_INDEX_FILENguyễn Thái Ngọc Duy, Sep 28, 2014
  107. 08/32 reflog: avoid constructing .lock path with git_pathNguyễn Thái Ngọc Duy, Sep 28, 2014
  108. 09/32 fast-import: use git_path() for accessing .git dir instead of get_git_dir()Nguyễn Thái Ngọc Duy, Sep 28, 2014
  109. 10/32 commit: use SEQ_DIR instead of hardcoding "sequencer"Nguyễn Thái Ngọc Duy, Sep 28, 2014
  110. 11/32 $GIT_COMMON_DIR: a new environment variableNguyễn Thái Ngọc Duy, Sep 28, 2014
  111. 12/32 git-sh-setup.sh: use rev-parse --git-path to get $GIT_DIR/objectsNguyễn Thái Ngọc Duy, Sep 28, 2014
  112. 13/32 *.sh: avoid hardcoding $GIT_DIR/hooks/...Nguyễn Thái Ngọc Duy, Sep 28, 2014
  113. 14/32 git-stash: avoid hardcoding $GIT_DIR/logs/....Nguyễn Thái Ngọc Duy, Sep 28, 2014
  114. 15/32 setup.c: convert is_git_directory() to use strbufNguyễn Thái Ngọc Duy, Sep 28, 2014
  115. 16/32 setup.c: detect $GIT_COMMON_DIR in is_git_directory()Nguyễn Thái Ngọc Duy, Sep 28, 2014
  116. 17/32 setup.c: convert check_repository_format_gently to use strbufNguyễn Thái Ngọc Duy, Sep 28, 2014
  117. 18/32 setup.c: detect $GIT_COMMON_DIR check_repository_format_gently()Nguyễn Thái Ngọc Duy, Sep 28, 2014
  118. 19/32 setup.c: support multi-checkout repo setupNguyễn Thái Ngọc Duy, Sep 28, 2014
  119. Johannes SixtOct 1, 2014
  120. 20/32 wrapper.c: wrapper to open a file, fprintf then closeNguyễn Thái Ngọc Duy, Sep 28, 2014
  121. 21/32 use new wrapper write_file() for simple file writingNguyễn Thái Ngọc Duy, Sep 28, 2014
  122. 22/32 checkout: support checking out into a new working directoryNguyễn Thái Ngọc Duy, Sep 28, 2014
  123. 23/32 prune: strategies for linked checkoutsNguyễn Thái Ngọc Duy, Sep 28, 2014
  124. Johannes SixtOct 1, 2014
  125. 24/32 checkout: reject if the branch is already checked out elsewhereNguyễn Thái Ngọc Duy, Sep 28, 2014
  126. 25/32 checkout: clean up half-prepared directories in --to modeNguyễn Thái Ngọc Duy, Sep 28, 2014
  127. 26/32 gc: style change -- no SP before closing parenthesisNguyễn Thái Ngọc Duy, Sep 28, 2014
  128. 27/32 gc: factor out gc.pruneexpire parsing codeNguyễn Thái Ngọc Duy, Sep 28, 2014
  129. 28/32 gc: support prune --worktreesNguyễn Thái Ngọc Duy, Sep 28, 2014
  130. 29/32 count-objects: report unused files in $GIT_DIR/worktrees/...Nguyễn Thái Ngọc Duy, Sep 28, 2014
  131. 30/32 git_path(): keep "info/sparse-checkout" per work-treeNguyễn Thái Ngọc Duy, Sep 28, 2014
  132. 31/32 checkout: don't require a work tree when checking out into a new oneNguyễn Thái Ngọc Duy, Sep 28, 2014
  133. 32/32 t2025: add a test to make sure grafts is working from a linked checkoutNguyễn Thái Ngọc Duy, Sep 28, 2014
  134. Junio C HamanoSep 28, 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.