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

Re: [PATCH v7 3/3] git-gui: handle GIT_DIR and GIT_WORK_TREE early

From
Johannes Sixt <j6t@kdbg.org>
Date
May 15, 2026, 08:28 UTC
Message-ID
<39541407-dfe6-4500-b3d4-5c8ea0cdb26d@kdbg.org>
In-Reply-To
<tencent_C4AD92361C8D7B76EB4C8A6F14EA33496805@qq.com>
Am 09.05.26 um 15:37 schrieb Shroom Moo:
Show 8 quoted lines
> Users expect these two invocations to be equivalent:
> 
>     GIT_WORK_TREE=/some/path GIT_DIR=/some/path/.git git gui
>     git -C /some/path gui
> 
> Currently, the environment variable variant often brings up the
> repository picker or ignores the requested worktree because
> GIT_WORK_TREE is processed too late.

I cannot reproduce the case that brings the repository picker. All other failure cases that I can produce are reasonable and do not indicate that GIT_WORK_TREE is processed too late.

Show 5 quoted lines
>  Moreover, after determining
> the working tree, git-gui unconditionally exports GIT_WORK_TREE.
> When no worktree is found (e.g., in a bare repository with a
> read-only subcommand like blame), an empty value is exported, which
> confuses commands like `git branch --show-current`.

True. I think the culprit is that we export GIT_WORK_TREE in the first place.

I suggest the following patch to replace this and the previous patch.
---- 8< ----
From: Johannes Sixt <j6t@kdbg.org>
Subject: [PATCH] git-gui: operate git commands without GIT_WORK_TREE
The manual page of the git command states about the --git-dir option:
   Specifying the location of the ".git" directory using this option
   (or GIT_DIR environment variable) turns off the repository
   discovery [...], and tells Git that you are at the top level of
   the working tree.
Use this to our advantage:
- Set GIT_DIR in the environment to the value that was discovered, so
  that the invoked git commands operate on the same repository
  database that Git GUI uses even after it changes the working
  directory.
- After changing the working directory to the top level of the working
  tree, ensure that GIT_WORK_TREE is not set, because, as per
  documentation, all git invocations from then on will assume that the
  current working directory is also the top level working tree.
- Remove the now obsolete GIT_WORK_TREE dance when subordinate Gitk or
  Git GUI are invoked for a submodule.

Do keep the state of GIT_WORK_TREE if we are in a bare repository, because Git GUI is not interested in the worktree at all, as no commit mode is possible in a bare repository.

This avoids cases where an empty GIT_WORK_TREE was exported into the environment, most notably by a call of `git gui blame HEAD file` in a bare repository.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
---
 git-gui.sh | 24 +++++++-----------------
 1 file changed, 7 insertions(+), 17 deletions(-)
diff --git a/git-gui.sh b/git-gui.sh
index 76560ec825cf..146a29a809a8 100755
--- a/git-gui.sh
+++ b/git-gui.sh
@@ -1216,6 +1216,7 @@ if {[is_bare]} {
 		exit 1
 	}
 	set _gitworktree [pwd]
+	catch { unset env(GIT_WORK_TREE) }
 }
 
 # Derive a human-readable repository name
@@ -1228,9 +1229,6 @@ if {[lindex $_reponame end] eq {.git}} {
 
 # Export the final paths
 set env(GIT_DIR) $_gitdir
-if {$_gitworktree ne {}} {
-	set env(GIT_WORK_TREE) $_gitworktree
-}
 
 ######################################################################
 ##
@@ -2029,7 +2027,7 @@ proc incr_font_size {font {amt 1}} {
 
 proc do_gitk {revs {is_submodule false}} {
 	global current_diff_path file_states current_diff_side ui_index
-	global _gitdir _gitworktree
+	global _gitdir
 
 	# -- Always start gitk through whatever we were loaded with.  This
 	#    lets us bypass using shell process on Windows systems.
@@ -2043,11 +2041,7 @@ proc do_gitk {revs {is_submodule false}} {
 
 		set pwd [pwd]
 
-		if {!$is_submodule} {
-			if {![is_bare]} {
-				cd $_gitworktree
-			}
-		} else {
+		if {$is_submodule} {
 			cd $current_diff_path
 			if {$revs eq {--}} {
 				set s $file_states($current_diff_path)
@@ -2067,18 +2061,16 @@ proc do_gitk {revs {is_submodule false}} {
 				}
 				set revs $old_sha1...$new_sha1
 			}
-			# GIT_DIR and GIT_WORK_TREE for the submodule are not the ones
-			# we've been using for the main repository, so unset them.
+			# GIT_DIR for the submodule is not the one we've been using for
+			# the main repository, so unset it. (GIT_WORK_TREE is already unset.)
 			# TODO we could make life easier (start up faster?) for gitk
 			# by setting these to the appropriate values to allow gitk
 			# to skip the heuristics to find their proper value
 			unset env(GIT_DIR)
-			unset env(GIT_WORK_TREE)
 		}
 		safe_exec_bg [concat $cmd $revs "--" "--"]
 
 		set env(GIT_DIR) $_gitdir
-		set env(GIT_WORK_TREE) $_gitworktree
 		cd $pwd
 
 		if {[info exists main_status]} {
@@ -2102,12 +2094,11 @@ proc do_git_gui {} {
 		error_popup [mc "Couldn't find git gui in PATH"]
 	} else {
 		global env
-		global _gitdir _gitworktree
+		global _gitdir
 
-		# see note in do_gitk about unsetting these vars when
+		# see note in do_gitk about unsetting this variable when
 		# running tools in a submodule
 		unset env(GIT_DIR)
-		unset env(GIT_WORK_TREE)
 
 		set pwd [pwd]
 		cd $current_diff_path
@@ -2115,7 +2106,6 @@ proc do_git_gui {} {
 		safe_exec_bg [concat $exe gui]
 
 		set env(GIT_DIR) $_gitdir
-		set env(GIT_WORK_TREE) $_gitworktree
 		cd $pwd
 
 		set status_operation [$::main_status \
-- 
2.54.0.215.g4fe990ec16
Previous: Shroom MooNext: Shroom Moo
Message 132 of 134 in “git-gui: handle bare repo or missing worktree”
  1. git-gui: handle bare repo or missing worktreeShroom Moo, Apr 21, 2026
  2. Johannes SixtApr 29, 2026
  3. 1/1 git-gui: protect rev-parse --show-toplevel callShroom Moo, Apr 29, 2026
  4. Mark LevedahlApr 29, 2026
  5. 1/1 git-gui: handle missing worktree and separated gitdirShroom Moo, Apr 30, 2026
  6. Mark LevedahlApr 30, 2026
  7. Shroom MooMay 1, 2026
  8. Johannes SixtMay 1, 2026
  9. Mark LevedahlMay 1, 2026
  10. Mark LevedahlMay 2, 2026
  11. Johannes SixtMay 3, 2026
  12. Mark LevedahlMay 4, 2026
  13. Mark LevedahlMay 5, 2026
  14. Johannes SixtMay 6, 2026
  15. Mark LevedahlMay 6, 2026
  16. Johannes SixtMay 6, 2026
  17. Mark LevedahlMay 6, 2026
  18. Mark LevedahlMay 7, 2026
  19. 1/1 git-gui: handle missing worktree and separated gitdirShroom Moo, May 1, 2026
  20. 1/1 git-gui: restructure repository startupShroom Moo, May 4, 2026
  21. Johannes SixtMay 6, 2026
  22. 0/3 git-gui: robustify startup and fix environment handlingShroom Moo, May 6, 2026
  23. 0/3 git-gui: robustify startup and fix environment handlingShroom Moo, May 9, 2026
  24. Mark LevedahlMay 14, 2026
  25. 00/11 Improve git gui operation without a worktreeMark Levedahl, May 14, 2026
  26. 01/11 git-gui: allow specifying path '.' to the browserMark Levedahl, May 14, 2026
  27. Johannes SixtMay 15, 2026
  28. Mark LevedahlMay 16, 2026
  29. 02/11 git-gui: refactor browser / blame argument parsingMark Levedahl, May 14, 2026
  30. Johannes SixtMay 15, 2026
  31. Mark LevedahlMay 16, 2026
  32. 04/11 git-gui: put choose_repository::pick in a procMark Levedahl, May 14, 2026
  33. Aina BootMay 15, 2026
  34. Mark LevedahlMay 15, 2026
  35. Johannes SixtMay 15, 2026
  36. Mark LevedahlMay 16, 2026
  37. 05/11 git-gui: use --absolute-git-dirMark Levedahl, May 14, 2026
  38. Johannes SixtMay 15, 2026
  39. Mark LevedahlMay 16, 2026
  40. 03/11 git-gui: guard set/unset of GIT_DIR and GIT_WORK_TREEMark Levedahl, May 14, 2026
  41. Johannes SixtMay 15, 2026
  42. Mark LevedahlMay 16, 2026
  43. 06/11 git gui: GIT_DIR / GIT_WORK_TREE make any discovery error fatalMark Levedahl, May 14, 2026
  44. 07/11 git-gui: use rev-parse exclusively to find a repositoryMark Levedahl, May 14, 2026
  45. Johannes SixtMay 15, 2026
  46. Mark LevedahlMay 16, 2026
  47. 08/11 git-gui: simplify [is_bare] to report if a worktree is knownMark Levedahl, May 14, 2026
  48. Johannes SixtMay 16, 2026
  49. 09/11 git-gui: support using repository parent dir as a worktreeMark Levedahl, May 14, 2026
  50. Johannes SixtMay 16, 2026
  51. Mark LevedahlMay 16, 2026
  52. 10/11 git-gui: improve worktree discoveryMark Levedahl, May 14, 2026
  53. Johannes SixtMay 16, 2026
  54. Mark LevedahlMay 16, 2026
  55. Johannes SixtMay 19, 2026
  56. Mark LevedahlMay 19, 2026
  57. 11/11 git-gui: add gui and pick as explicit subcommandsMark Levedahl, May 14, 2026
  58. Johannes SixtMay 16, 2026
  59. Mark LevedahlMay 16, 2026
  60. Johannes SixtMay 19, 2026
  61. Mark LevedahlMay 19, 2026
  62. Johannes SixtMay 19, 2026
  63. Johannes SixtMay 16, 2026
  64. 00/11 Improve git gui operation without a worktreeMark Levedahl, May 20, 2026
  65. 01/11 git-gui: guard set/unset of GIT_DIR and GIT_WORK_TREEMark Levedahl, May 20, 2026
  66. Johannes SixtMay 22, 2026
  67. Mark LevedahlMay 22, 2026
  68. Johannes SixtMay 23, 2026
  69. Aina BootMay 23, 2026
  70. Mark LevedahlMay 23, 2026
  71. 02/11 git-gui: return status from choose_repository::pickMark Levedahl, May 20, 2026
  72. Johannes SixtMay 22, 2026
  73. 04/11 git-gui: use rev-parse exclusively to find a repositoryMark Levedahl, May 20, 2026
  74. Johannes SixtMay 22, 2026
  75. Mark LevedahlMay 22, 2026
  76. Mark LevedahlMay 22, 2026
  77. 05/11 git-gui: simplify [is_bare] to report if a worktree is knownMark Levedahl, May 20, 2026
  78. 06/11 git-gui: use git rev-parse for worktree discoveryMark Levedahl, May 20, 2026
  79. Johannes SixtMay 23, 2026
  80. 07/11 git-gui: try harder to find worktree from gitdirMark Levedahl, May 20, 2026
  81. Shroom MooMay 21, 2026
  82. Mark LevedahlMay 21, 2026
  83. Shroom MooMay 22, 2026
  84. Mark LevedahlMay 22, 2026
  85. Johannes SixtMay 23, 2026
  86. Shroom MooMay 23, 2026
  87. Johannes SixtMay 23, 2026
  88. Mark LevedahlMay 23, 2026
  89. 03/11 git-gui: use --absolute-git-dirMark Levedahl, May 20, 2026
  90. Johannes SixtMay 22, 2026
  91. 08/11 git-gui: use HEAD as current branch when detached (bug fix)Mark Levedahl, May 20, 2026
  92. Johannes SixtMay 23, 2026
  93. 09/11 git-gui: allow specifying path '.' to the browserMark Levedahl, May 20, 2026
  94. Johannes SixtMay 23, 2026
  95. Mark LevedahlMay 23, 2026
  96. 10/11 git-gui: adapt blame/browser parsing for bare operationMark Levedahl, May 20, 2026
  97. Shroom MooMay 21, 2026
  98. Mark LevedahlMay 21, 2026
  99. Shroom MooMay 22, 2026
  100. fixup git-gui: allow blame to show uncommitted changesMark Levedahl, May 23, 2026
  101. Johannes SixtMay 23, 2026
  102. 11/11 git-gui: add gui and pick as explicit subcommandsMark Levedahl, May 20, 2026
  103. Johannes SixtMay 24, 2026
  104. Johannes SixtMay 24, 2026
  105. Mark LevedahlMay 25, 2026
  106. 00/12 Improve git gui operation without a worktreeMark Levedahl, May 31, 2026
  107. 01/12 git-gui: use HEAD as current branch when detachedMark Levedahl, May 31, 2026
  108. 02/12 git-gui: remove unnecessary 'cd $_gitworktree' from do_gitkMark Levedahl, May 31, 2026
  109. 03/12 git-gui: guard set/unset of GIT_DIR and GIT_WORK_TREEMark Levedahl, May 31, 2026
  110. 04/12 git-gui: do not change global vars in choose_repository::pickMark Levedahl, May 31, 2026
  111. 05/12 git-gui: use --absolute-git-dirMark Levedahl, May 31, 2026
  112. 06/12 git-gui: use rev-parse exclusively to find a repositoryMark Levedahl, May 31, 2026
  113. 07/12 git-gui: use git rev-parse for worktree discoveryMark Levedahl, May 31, 2026
  114. 08/12 git-gui: simplify [is_bare] to report if a worktree is knownMark Levedahl, May 31, 2026
  115. 09/12 git-gui: try harder to find worktree from gitdirMark Levedahl, May 31, 2026
  116. 10/12 git-gui: allow specifying path '.' to the browserMark Levedahl, May 31, 2026
  117. 11/12 git-gui: check browser/blame arguments carefullyMark Levedahl, May 31, 2026
  118. 12/12 git-gui: add gui and pick as explicit subcommandsMark Levedahl, May 31, 2026
  119. Johannes SixtJun 2, 2026
  120. Mark LevedahlJun 2, 2026
  121. Johannes SixtJun 2, 2026
  122. Shroom MooApr 29, 2026
  123. 2/3 git-gui: disable gitk visualization when no worktree availableShroom Moo, May 6, 2026
  124. 1/3 git-gui: restructure repository startupShroom Moo, May 6, 2026
  125. 3/3 git-gui: handle GIT_DIR and GIT_WORK_TREE earlyShroom Moo, May 6, 2026
  126. Mark LevedahlMay 7, 2026
  127. Aina BootMay 9, 2026
  128. Shroom MooMay 9, 2026
  129. 1/3 git-gui: restructure repository startupShroom Moo, May 9, 2026
  130. Johannes SixtMay 15, 2026
  131. 3/3 git-gui: handle GIT_DIR and GIT_WORK_TREE earlyShroom Moo, May 9, 2026
  132. Johannes SixtMay 15, 2026
  133. 2/3 git-gui: disable gitk visualization when no worktree availableShroom Moo, May 9, 2026
  134. Johannes SixtMay 15, 2026

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.