From: Caleb White <cdwhite3@pm.me>
To: Rebecca Turner <rbt@fastmail.com>
Cc: git@vger.kernel.org
Subject: Re: `git worktree list` when bare repository is named `.git`
Date: Fri, 11 Oct 2024 16:45:22 +0000 [thread overview]
Message-ID: <D4T4N4E0BR32.14QK0OEESB5CH@pm.me> (raw)
In-Reply-To: <517c8829-f98f-4fed-af4d-b84182fb253e@app.fastmail.com>
On Fri Oct 11, 2024 at 11:19 AM CDT, Rebecca Turner wrote:
> Ah, I should give some context here. I'm using worktrees with the layout you
> describe later in your email:
>
> my-repo/
> .git/ <- bare git directory
> main/ <- worktree for main branch
> feature1/ <- worktree for feature work
> ...
>
> I'm writing a tool to manage these layouts for you. I want to provide two
> features:
>
> 1. The ability to add a new worktree in a slightly more magical manner; in
> particular, I want to be able to do `git my-tool add feature2` and add a new
> worktree in the same directory as all the other worktrees.
If your repository is already set up in the layout you describe, you can
just execute `git worktree add` (I have this aliased to `g w add`, I'm a
lazy typer haha) in the `my-repo` directory.
> For a non-bare main worktree, that directory is the parent of the main
> worktree.
I would *not* do this, you may just want to not support this case. I
imagine most folks have a common directory for all their repositories,
and polluting the parent directory with worktrees sounds like a bad idea.
>
> For a bare main worktree named `.git`, it's the path of the main
> worktree. (Nothing in the `git worktree list` output indicates this is the
> case!)
>
> For other bare worktrees, it's the parent of the main worktree.
Note that you can use `rev-parse` to get the actual directory:
git rev-parse --absolute-git-dir
~/sources/bare-repo/.git
> 2. The ability to convert an existing repository in this layout.
>
> This requires separating the `$GIT_DIR` from the worktree and then
> reassociating them, in order to convert the non-bare main worktree into a
> bare main worktree and a second linked worktree. (In particular, I'd like to
> avoid the cost of copying all the files in a large checkout.)
To convert an existing repository to this layout, all you should have to
do is:
- Add `bare = true` to the `[core]` section of the `.git/config` file
- Remove everything except the `.git` directory
- Create a new worktree for the default branch
- Profit!
>> When I was first doing research on this, I found a ton of articles with
>> all kinds of different ways to do it. Some folks put their worktrees in
>> the same directory as the actual repository (intermixed with their
>> code), some polluted the parent directory, some created a detached
>> commit that removed all files from the default working tree and then
>> created the worktrees, some used a bare repository but then just created
>> the worktrees in the same directory, etc. I finally came across an
>> article that showed the `.bare` method above and I thought that was the
>> cleanest method. However, after using it for a while, I realized that
>> I could just move `.bare` to `.git` and it would work just fine (and
>> I could remove an extra file). I've been using that method ever since.
>
> Yes, exactly! My frustration with this technique is how difficult it is to use.
> I have existing checkouts I'd like to convert to worktree repositories, and
> `git clone --bare` doesn't create remote-tracking branches, so it's strangely
> difficult to set up repositories like this. I'm hoping to ease some of this
> with my new tool.
I've created a helper script[1] that allows me to clone a bare repository
to use with worktrees. In case you don't know, any script in your PATH
that starts with `git-` can be called as `git <script-name>`. I then
have a git alias for this script and so I can run the following to set
everything up:
git cloneb https://github.com/git/git
The script also allows setting up an upstream remote at the same time
in case you've forked the repository.
git cloneb --remote=https://github.com/git/git https://github.com/<user>/git
[1]: https://github.com/calebdw/dotfiles/blob/master/scripts/git-clone-bare-for-worktrees
Best,
next prev parent reply other threads:[~2024-10-11 16:45 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-11 3:52 `git worktree list` when bare repository is named `.git` Caleb White
2024-10-11 4:59 ` Rebecca Turner
2024-10-11 5:36 ` Caleb White
2024-10-11 16:19 ` Rebecca Turner
2024-10-11 16:45 ` Caleb White [this message]
2024-10-11 22:17 ` Patrick Callahan
[not found] ` <CACt=GQry+mR7fVSUEdpPjsgSoDURk4W-DRPqLkom-f9Q0KBuTQ@mail.gmail.com>
2024-10-21 19:09 ` Rebecca Turner
-- strict thread matches above, loose matches on Subject: below --
2024-10-11 1:12 Rebecca Turner
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=D4T4N4E0BR32.14QK0OEESB5CH@pm.me \
--to=cdwhite3@pm.me \
--cc=git@vger.kernel.org \
--cc=rbt@fastmail.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).