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

Re: bug with .git file and aliases

From
Geoffrey Irving <irving@naml.us>
Date
Aug 10, 2009, 20:22 UTC
Message-ID
<7f9d599f0908101322i46384247m303e28955f88bbb@mail.gmail.com>
In-Reply-To
<20090720152117.GB5347@coredump.intra.peff.net>
On Mon, Jul 20, 2009 at 11:21 AM, Jeff King<peff@peff.net> wrote:
Show 15 quoted lines
> On Mon, Jul 20, 2009 at 09:54:12AM -0400, Geoffrey Irving wrote:
>
>> git 1.6.3.3 has a bug related to .git file support and aliases.
>> Specifically, if you make an alias for status and call it from a
>> subdirectory, git status chdirs into the true .git dir but then
>> chdir's back to the wrong place in order to run the lstats for status.
>>  The result is that git status thinks all files have disappeared.
>
> Yeah, this is a known problem. The problem is that the 'git' wrapper
> sets up the environment only partially when running aliases, and then
> the resulting command ends up confused about where the worktree is. I
> really don't remember the specifics, but you can probably find some
> discussion in the list archives.  Fixing it, IIRC, required some
> refactoring of the setup code (which I had hoped to get to at some
> point, but I am way behind on my git todo list).

The attached patch fixes the bug for me. I'll leave it to others to determine whether this is a good way to fix the problem.

Thanks, Geoffrey

From ec47aa09e5bc8d9a8c07cca9f8ef17a9898819c1 Mon Sep 17 00:00:00 2001
From: Geoffrey Irving <irving@naml.us>
Date: Mon, 10 Aug 2009 15:59:21 -0400
Subject: [PATCH] setup.c: fix work tree setup for .git-files and aliases

When .git-files and aliases are used together, the setup machinery gets confused and ends up with the wrong work_tree. Specifically, git_work_tree_cfg is set to the correct value first, but set_work_tree resets git_work_tree_cfg to the current directory, which (at least in this case) is incorrect.

set_work_tree now detects this case by checking to see if git_work_tree_cfg is already set. If so, it leaves git_work_tree_cfg unchanged and instead uses the current directory to compute and return the correct prefix (where we are relative to the work tree).

Signed-off-by: Geoffrey Irving <irving@naml.us>
---
 setup.c |   15 +++++++++++++--
 1 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/setup.c b/setup.c
index e3781b6..97f7eb1 100644
--- a/setup.c
+++ b/setup.c
@@ -198,13 +198,24 @@ int is_inside_work_tree(void)
 static const char *set_work_tree(const char *dir)
 {
 	char buffer[PATH_MAX + 1];
+	size_t offset;
 
 	if (!getcwd(buffer, sizeof(buffer)))
 		die ("Could not get the current working directory");
-	git_work_tree_cfg = xstrdup(buffer);
 	inside_work_tree = 1;
 
-	return NULL;
+	if (!git_work_tree_cfg) {
+		git_work_tree_cfg = xstrdup(buffer);
+		return NULL;
+	} else {
+		offset = strlen(git_work_tree_cfg);
+		if (memcmp(git_work_tree_cfg, buffer, offset)
+			|| (buffer[offset] && buffer[offset] != '/'))
+			die ("fatal: not inside work tree (should not happen)");
+		if (!buffer[offset] || !buffer[offset+1])
+			return NULL;
+		return xstrdup(strcat(buffer + offset + 1, "/"));
+	}
 }
 
 void setup_work_tree(void)
-- 
1.6.3.3
Previous: Jeff KingNext: Johannes Schindelin
Message 7 of 13 in “bug with .git file and aliases”
  1. Geoffrey IrvingJul 20, 2009
  2. Santi BéjarJul 20, 2009
  3. Geoffrey IrvingJul 20, 2009
  4. Santi BéjarJul 20, 2009
  5. Geoffrey IrvingJul 20, 2009
  6. Jeff KingJul 20, 2009
  7. Geoffrey IrvingAug 10, 2009
  8. Johannes SchindelinAug 10, 2009
  9. Geoffrey IrvingAug 11, 2009
  10. Johannes SchindelinAug 11, 2009
  11. Michael J GruberAug 11, 2009
  12. Johannes SixtAug 11, 2009
  13. Michael J GruberAug 11, 2009

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.