The $GIT_BARE idea sounds very sensible to me.

Jeff King <> wrote:

>On Thu, Mar 07, 2013 at 05:47:45PM -0500, Mark Lodato wrote:
>> It seems that the fallback bare repository detection in the absence
>> core.bare fails for aliases.
>This triggered some deja vu for me, so I went digging. And indeed, this
>has been a bug since at least 2008. This patch (which never got
>fixed it:
>The issue is that we treat:
>  GIT_DIR=/some/path git ...
>as if the current directory is the work tree, unless core.bare is
>explicitly set, or unless an explicit work tree is given (via
>GIT_WORK_TREE, "git --work-tree", or in the config).  This is handy,
>backwards compatible.
>Inside setup_git_directory, when we find the directory we put it in
>$GIT_DIR for later reference by ourselves or sub-programs (since we are
>typically moving to the top of the working tree next, we need to record
>the original path, and can't rely on discovery finding the same path
>again). But we don't set $GIT_WORK_TREE. So if you don't have core.bare
>set, the above rule will kick in for sub-programs, or for aliases
>will call setup_git_directory again).
>The solution is that when we set $GIT_DIR like this, we need to also
>"no, there is no working tree; we are bare". And that's what that patch
>does. It's 5 years old now, so not surprisingly, it does not apply
>cleanly. The moral equivalent in today's code base would be something
>diff --git a/environment.c b/environment.c
>index 89d6c70..8edaedd 100644
>--- a/environment.c
>+++ b/environment.c
>@@ -200,7 +200,8 @@ void set_git_work_tree(const char *new_work_tree)
>               return;
>       }
>       git_work_tree_initialized = 1;
>-      work_tree = xstrdup(real_path(new_work_tree));
>+      if (*new_work_tree)
>+              work_tree = xstrdup(real_path(new_work_tree));
> }
> const char *get_git_work_tree(void)
>diff --git a/setup.c b/setup.c
>index e1cfa48..f0e1251 100644
>--- a/setup.c
>+++ b/setup.c
>@@ -544,7 +544,7 @@ static const char *setup_explicit_git_dir(const
>char *gitdirenv,
>       worktree = get_git_work_tree();
>       /* both get_git_work_tree() and cwd are already normalized */
>-      if (!strcmp(cwd, worktree)) { /* cwd == worktree */
>+      if (!worktree || !strcmp(cwd, worktree)) { /* cwd == worktree */
>               set_git_dir(gitdirenv);
>               free(gitfile);
>               return NULL;
>@@ -636,6 +636,8 @@ static const char *setup_bare_git_dir(char *cwd,
>int offset, int len, int *nongi
>       }
>       else
>               set_git_dir(".");
>+      setenv(GIT_WORK_TREE_ENVIRONMENT, "", 1);
>       return NULL;
> }
>which passes your test. Unfortunately, this patch runs afoul of the
>complaints that prevented the original from being acceptable (weirdness
>on Windows with empty environment variables).
>Having read the discussion again, I _think_ the more sane thing is to
>actually just have a new variable, $GIT_BARE, which overrides any
>core.bare config (just as $GIT_WORK_TREE override core.worktree). And
>then we set that explicitly when we are in a bare $GIT_DIR, propagating
>our auto-detection to sub-processes.
>To unsubscribe from this list: send the line "unsubscribe git" in
>the body of a message to
>More majordomo info at

Pardon terseness, typo and HTML from a tablet.
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to
More majordomo info at

Reply via email to