Confusing error message due to Git trusting is_bare_repository()

2 messages, 2 authors, 2016-06-15 · open the first message on its own page

Confusing error message due to Git trusting is_bare_repository()

From: Ævar Arnfjörð Bjarmason <hidden>
Date: 2016-06-15 22:50:52

I had a co-worker git this well-known error message:

    error: refusing to update checked out branch: refs/heads/master
    error: By default, updating the current branch in a non-bare repository
    error: is denied, because it will make the index and work tree inconsistent
    error: with what you pushed, and will require 'git reset --hard' to match
    error: the work tree to HEAD.

It *was* a bare repo, but the config file had bare=false because
someone had simply copied a .git tree from a non-bare repo to make it.

The issue is that we just use this:

    int is_bare_repository(void)
    {
        /* if core.bare is not 'false', let's see if there is a work tree */
        return is_bare_repository_cfg && !get_git_work_tree();
    }

For the purposes of the error message it would be helpful if we also
detected whether something didn't have a working tree, but was set to
bare=false, and tell the user to updatet he bare=false to bare=true
for his almost-bare repository.

Re: Confusing error message due to Git trusting is_bare_repository()

From: Jeff King <hidden>
Date: 2016-06-15 22:50:54

On Fri, Mar 25, 2011 at 11:56:20AM +0100, Ævar Arnfjörð Bjarmason wrote:
I had a co-worker git this well-known error message:

    error: refusing to update checked out branch: refs/heads/master
    error: By default, updating the current branch in a non-bare repository
    error: is denied, because it will make the index and work tree inconsistent
    error: with what you pushed, and will require 'git reset --hard' to match
    error: the work tree to HEAD.

It *was* a bare repo, but the config file had bare=false because
someone had simply copied a .git tree from a non-bare repo to make it.
That seems like the problem there. I'm not blaming the user; what they
expected to happen is reasonable, and even used to work. But I wonder if
better education is possible.
The issue is that we just use this:

    int is_bare_repository(void)
    {
        /* if core.bare is not 'false', let's see if there is a work tree */
        return is_bare_repository_cfg && !get_git_work_tree();
    }
For the purposes of the error message it would be helpful if we also
detected whether something didn't have a working tree, but was set to
bare=false, and tell the user to updatet he bare=false to bare=true
for his almost-bare repository.
How do we know whether or not it has a working tree? Can't I do
something like:

  cd /var/working-trees/foo
  git init
  mv .git /var/repositories/foo.git
  export GIT_DIR=/var/repositories/foo.git
  echo content >file && git add file && git commit -m foo

I thought the reason that core.bare was introduced was to handle weird
cases like this.

-Peff
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help