From: <rsbecker@nexbridge.com>
To: "'Sean Allred'" <allred.sean@gmail.com>
Cc: <git@vger.kernel.org>
Subject: RE: Bug report - Can create worktrees from bare repo / such worktrees can fool is_bare_repository()
Date: Sat, 18 Dec 2021 16:55:34 -0500 [thread overview]
Message-ID: <000401d7f45a$005abea0$01103be0$@nexbridge.com> (raw)
In-Reply-To: <CABceR4Z+CoaUuGrJS+D1C9x+nR278S4ATWozz-ni2Y96FJc3cg@mail.gmail.com>
On December 18, 2021 2:01 PM: Sean Allred wrote:
> On Sat, Dec 18, 2021 at 11:47 AM <rsbecker@nexbridge.com> wrote:
> >
> > On December 18, 2021 11:47 AM, Sean Allred wrote:
> > > Hi folks! See the following bug report. Let me know if anything is
> > > unclear -- in all honesty, I neglectfully `git worktree remove
> > > --force`'d the first one I wrote...
> > >
> > > Thank you for filling out a Git bug report!
> > > Please answer the following questions to help us understand your issue.
> > >
> > > What did you do before the bug happened? (Steps to reproduce your
> > > issue)
> > >
> > > ~$ git clone --bare https://github.com/git/git.git
> > > ---clip---
> > >
> > > ~/gitbare$ git config --list --show-origin
> > > file:config core.repositoryformatversion=1
> > > file:config core.filemode=false
> > > file:config core.bare=true
> > > file:config core.ignorecase=true
> > > file:config remote.origin.url=https://github.com/git/git.git
> > >
> > > ~/gitbare$ git worktree add --no-checkout ../next
> > > Preparing worktree (checking out 'next')
> > >
> > > ~/gitbare$ git config --list --show-origin
> > > file:config core.repositoryformatversion=1
> > > file:config core.filemode=false
> > > file:config core.bare=true
> > > file:config core.ignorecase=true
> > > file:config remote.origin.url=https://github.com/git/git.git
> > >
> > > ~/gitbare$ cd ../next/
> > >
> > > ~/next$ git config --list --show-origin
> > > file:../gitbare/config core.repositoryformatversion=1
> > > file:../gitbare/config core.filemode=false
> > > file:../gitbare/config core.bare=true
> > > file:../gitbare/config core.ignorecase=true
> > > file:../gitbare/config remote.origin.url=https://github.com/git/git.git
> > >
> > > ~/next$ git rev-parse --is-bare-repository
> > > false
> > >
> > > ~/next$ git config extensions.worktreeconfig true
> > > ~/next$ git rev-parse --is-bare-repository
> > > true
> > >
> > > ~/next$ git config --unset extensions.worktreeconfig
> > > ~/next$ git rev-parse --is-bare-repository
> > > false
> > >
> > > I actually found this situation (and narrowed it to the above) by
> > > trying to perform a sparse-checkout in the worktree. It appears
> > > sparse-checkout by default uses a worktree-specific config (which does
> make sense).
> > >
> > > What did you expect to happen? (Expected behavior)
> > >
> > > I expected one of the following to happen:
> > >
> > > 1. I should have been blocked from creating a worktree from a bare
> > > repository.
> > >
> > > 2. is_bare_repository() shouldn't be fooled by this situation,
> > > assuming it's valid.
> > >
> > > All things being equal, I would more expect to have been blocked
> > > from creating a worktree from a bare repository. Personally, this
> > > bare repo + worktree setup doesn't not align with my experience so
> > > far with how bare repos are normally used (i.e., as a convenience
> > > for centralized remotes that will never be doing a checkout).
> > >
> > > What happened instead? (Actual behavior)
> > >
> > > is_bare_repository() is fooled and I'm prevented from performing
> > > any operation that requires a worktree (like performing a sparse
> > > checkout).
> > >
> > > What's different between what you expected and what actually
> happened?
> > >
> > > is_bare_repository() is fooled into thinking the worktree is not a
> > > worktree / I'm able to create a worktree from a bare repo.
> > >
> > > Anything else you want to add:
> > >
> > > Please review the rest of the bug report below.
> > > You can delete any lines you don't wish to share.
> > >
> > >
> > > [System Info]
> > > git version:
> > > git version 2.34.1
> > > cpu: x86_64
> > > no commit associated with this build
> > > sizeof-long: 8
> > > sizeof-size_t: 8
> > > shell-path: /bin/sh
> > > uname: Linux 5.4.72-microsoft-standard-WSL2 #1 SMP Wed Oct 28
> > > 23:40:43 UTC 2020 x86_64 compiler info: gnuc: 9.3 libc info: glibc:
> > > 2.31 $SHELL (typically, interactive shell): /bin/bash
> > >
> > >
> > > [Enabled Hooks]
> > > not run from a git repository - no hooks to show
> >
> > My thoughts:
> >
> > 1. I think it is legitimate to create a worktree from a bare repository. The
> worktree is using its own working directory/index and does not require
> anything from the bare repo.
> > 2. You ran is_bare_repository from next, which was in your worktree - not
> a bare repo, so that answer actually makes sense.
> I'm not sure I follow. I did run is_bare_repository from the next-worktree,
> but the return value was evidently dependent on the value of
> extensions.worktreeconfig. When true, is_bare_repository returned true --
> even within the next-worktree. Unless I'm missing something fairly
> fundamental here...
I agree that this interpretation *may* be incorrect. Worktreeconfig allows a configuration associated with worktrees but does not mean that there is one. It seems like worktreeconfig=true is causing git to check the worktree-specific configuration, finds out that you are in a worktree but there is in fact no worktree configuration specified, so the main repo is checked, which is bare, so reports true. When worktreeconfig=false, it looks like a quick decision is made that because you are in a worktree, obviously you are not bare (this may be an incorrect interpretation). I can somewhat see both sides of this. Perhaps some clarification on the interpretation is required.
It does seem like is_bare_repository_cfg is false in is_bare_repository, which seems to be wrong in context. However, there is a strange comparison in worktree.c that bothers me - is_bare_repository_cfg == 1 around line 67 which is a numeric comparison to a boolean. I think that may be incorrect. There is a NEEDSWORK comment in the code immediately before that line.
Hoping someone else can chime in on this.
> > I'm not sure whether this is an expected use case but it does make sense
> > to be one. If you typically work in worktrees and write scripts under that
> > assumption, not having to worry about being in the non-worktree part of a
> > clone makes sense. So creating a worktree off a bare repo is not a bad thing,
> > assuming everything else is correct.
The essential part of create a worktree from a bare repo still makes sense to me.
next prev parent reply other threads:[~2021-12-18 21:55 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-18 16:46 Bug report - Can create worktrees from bare repo / such worktrees can fool is_bare_repository() Sean Allred
2021-12-18 17:47 ` rsbecker
2021-12-18 19:00 ` Sean Allred
2021-12-18 21:55 ` rsbecker [this message]
2021-12-19 20:16 ` Eric Sunshine
2021-12-19 20:46 ` Sean Allred
2021-12-19 21:32 ` rsbecker
2021-12-19 22:23 ` Sean Allred
2021-12-19 22:51 ` rsbecker
2021-12-19 23:30 ` Eric Sunshine
2021-12-19 23:45 ` Eric Sunshine
2021-12-19 23:54 ` rsbecker
2021-12-20 0:07 ` Eric Sunshine
2021-12-20 0:58 ` Eric Sunshine
2021-12-20 14:11 ` Derrick Stolee
2021-12-20 15:58 ` Eric Sunshine
2021-12-20 17:29 ` Derrick Stolee
2021-12-20 21:58 ` Eric Sunshine
2021-12-20 16:20 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='000401d7f45a$005abea0$01103be0$@nexbridge.com' \
--to=rsbecker@nexbridge.com \
--cc=allred.sean@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.