path: root/setup.c
diff options
authorNguyễn Thái Ngọc Duy <>2010-12-27 01:26:04 (GMT)
committerJunio C Hamano <>2010-12-27 16:34:19 (GMT)
commit0ed748134748579a13cf27e1e8b3e55371bcd9dc (patch)
tree3f39dda690dc82e361b0e33df3bf59512d2bd3f3 /setup.c
parente7d1efbe9dc5c03e65a573d6f8c4d8804118eb0a (diff)
setup_work_tree: adjust relative $GIT_WORK_TREE after moving cwd
When setup_work_tree() is called, it moves cwd to $GIT_WORK_TREE and makes internal copy of $GIT_WORK_TREE absolute. The environt variable, if set by user, remains unchanged. If the variable is relative, it is no longer correct because its base dir has changed. Instead of making $GIT_WORK_TREE absolute too, we just say "." and let subsequent git processes handle it. Reported-by: Michel Briand <> Signed-off-by: Nguyễn Thái Ngọc Duy <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'setup.c')
1 files changed, 8 insertions, 0 deletions
diff --git a/setup.c b/setup.c
index 2e2865c..be550af 100644
--- a/setup.c
+++ b/setup.c
@@ -221,6 +221,14 @@ void setup_work_tree(void)
git_dir = make_absolute_path(git_dir);
if (!work_tree || chdir(work_tree))
die("This operation must be run in a work tree");
+ /*
+ * Make sure subsequent git processes find correct worktree
+ * if $GIT_WORK_TREE is set relative
+ */
+ setenv(GIT_WORK_TREE_ENVIRONMENT, ".", 1);
set_git_dir(make_relative_path(git_dir, work_tree));
initialized = 1;