From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bsmtp.bon.at (bsmtp.bon.at [213.33.87.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 01A3B401489 for ; Fri, 15 May 2026 08:28:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.33.87.14 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778833733; cv=none; b=X6ixi+QoYbZrBUzTXIw6p9v7SVU22ld8E0GVMvkuibtg66IRIxsgCzLPEt5gMdSmtYUORnGFFtGWRe0fniwGGxv7Wcf4Pwst5074E+YN31rPN9hpPJlFbCqASjDSul44dpPvhdGzqBIDaztcNRsVDnYVEIxNUxqfFtStw3e5/0A= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778833733; c=relaxed/simple; bh=I9chlimPoZylzybpcARbBRnjzQ1Ds/eeHhV2vNpkAhg=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=GjTMFXyfIXSdkudgJi3kuPRfM2FA+Ja3a0DfGdkof/s+RyN7zoq5adtKXBqN7X0lO59+plJbWXQ7LgtE9PU89iGQbGwu3bgRO6BLur1Mdc7oPwGzHfCE51zwTqzdwY8Kv3yyIACD/lKTYmK5xNC3lvS+CuwqZXyBZZ7mGTQgXEQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kdbg.org; spf=pass smtp.mailfrom=kdbg.org; arc=none smtp.client-ip=213.33.87.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kdbg.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kdbg.org Received: from [192.168.0.101] (unknown [93.83.142.38]) by bsmtp.bon.at (Postfix) with ESMTPSA id 4gH0hx1HFmzRnlv; Fri, 15 May 2026 10:28:48 +0200 (CEST) Message-ID: <39541407-dfe6-4500-b3d4-5c8ea0cdb26d@kdbg.org> Date: Fri, 15 May 2026 10:28:48 +0200 Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v7 3/3] git-gui: handle GIT_DIR and GIT_WORK_TREE early Content-Language: en-US To: Shroom Moo , git@vger.kernel.org Cc: Mark Levedahl , Aina Boot References: <20260509133756.1367-1-egg_mushroomcow@foxmail.com> From: Johannes Sixt In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Am 09.05.26 um 15:37 schrieb Shroom Moo: > 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. > 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 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 --- 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