git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Jan Hudec <bulb@ucw.cz>
To: Pierre Habouzit <madcoder@madism.org>
Cc: Git ML <git@vger.kernel.org>
Subject: Re: fixing workdirs
Date: Tue, 17 Aug 2010 20:34:35 +0200	[thread overview]
Message-ID: <20100817183435.GA2717@efreet.light.src> (raw)
In-Reply-To: <20100708110842.GC12789@madism.org>

On Thu, Jul 08, 2010 at 13:08:42 +0200, Pierre Habouzit wrote:
> At work we (ab-)use workdirs a lot, though, workdirs aren't for
> everybody, and as our company grows, not everybody uses them sanely.
> 
> The two problems (that are well known to this list, and is the reason
> why git new-workdir is in contrib afaict) with workdirs are:
> 
>   - the HEAD reflogs aren't shared, which means that pruning a working
>     directory may trash accessible stuff from the reflog of another one.
>
>   - if two workdirs are on the same branch at the same time, really,
>     really, *REALLY* bad things may happen if one isn't aware of that
>     fact.

It should be possible to guard against those bad things. Basically the bad
things happen when a symbolic HEAD's target is changed in a way the HEAD is
not aware. But in those, and only those, cases the HEAD's reflog is not
updated. So some operations could check whether HEAD@{0} resolves to the same
commit as HEAD and if not they would either fail or automatically detach
HEAD.

That would serve as a safeguard not just against one worktree commiting to
a branch checked out in another worktree. It would also safeguard against
pushing to the branch provided the code in update that updates HEAD's reflog
was disabled for non-bare repositories.

> I'm intending to adress those issues, though I would like to know how it
> would be received. My current plan is this one. Have a git workdir
> command, with a few subcommands (create, move, rename, ...), that
> addresses both of the previous issues.
> 
> for the first one, the fix is simple: workdirs have now a name, and
> their HEAD reflog lives in the "master" git repository reflog namespace
> under logs/workdir/$workdir_name/HEAD. The workdir HEAD reflog is then a
> symlink to the masters.
> 
> In this way, all workdirs see all the reflogs of every single workdir,
> and pruning is safe again.

The problem with it is that it falls apart when somebody forgets to use the
'git worktree remove' command and deletes (or renames) the work-tree
manually.

Alternative idea would be to add support for new layout with one repository
and multiple worktrees. The worktrees would be restricted to siblings of the
.git directory where the repository lives with the repository itself being
marked as bare. So the layout would be:

  somedir/
  somedir/.git/           <- the repository, makred as bare
  somedir/worktree1/      <- a worktree
  somedir/worktree1/.git/ <- worktree's .git in current format
  somedir/worktree2/      <- another worktree
  somedir/worktree2/.git/ <- worktree's .git in current format
  ...

Such scheme would exchange some flexibility for more safety. The worktrees
could be created with current new-workdir. They would be found as simply
$GIT_DIR/../*/.git for purpose of solving the two problems above. On the
other hand a method for preparing this layout (git init --multiple-trees,
git clone --multiple-trees or something like that) would be needed.

IIRC bazaar uses scheme like this for it's multiple-worktree support.

> For the second one, when a workdir is created, a [workdir "foo"] section
> is added to the master directory, with a path configuration variable
> pointing to the ... path of the working directory. My plan would be to
> teach git checkout to lean about that, and when there are workdirs
> set up, git checkout would check that no other workdir is currently "on
> the same branch", and would refuse to checkout to a branch that is
> already checkouted elsewhere.

Wait a second. Don't you have the HEADs and their reflogs for workdirs stored
in the master? So you can just compare with all the other HEADs there, no?

The bookkeeping would break if you just deleted the workdir without telling
git. The configuration will break even more readily as renaming also breaks
it. 

Kind regards,
Jan

-- 
						 Jan 'Bulb' Hudec <bulb@ucw.cz>

      parent reply	other threads:[~2010-08-17 18:53 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-08 11:08 fixing workdirs Pierre Habouzit
2010-07-08 18:37 ` Tait
2010-07-08 18:56   ` Joshua Jensen
2010-07-09  7:49   ` Pierre Habouzit
2010-07-08 19:40 ` Junio C Hamano
2010-07-08 19:56   ` Avery Pennarun
2010-07-09  7:56   ` Pierre Habouzit
2010-07-09 22:25     ` Junio C Hamano
2010-07-19  9:02       ` Pierre Habouzit
2010-08-17 18:34 ` Jan Hudec [this message]

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

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100817183435.GA2717@efreet.light.src \
    --to=bulb@ucw.cz \
    --cc=git@vger.kernel.org \
    --cc=madcoder@madism.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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).