From: Jeff King <peff@peff.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>, git@vger.kernel.org
Subject: Re: [BUG?] git checkout $commit -- somedir doesn't drop files
Date: Thu, 19 Sep 2013 18:13:23 -0400 [thread overview]
Message-ID: <20130919221323.GA18085@sigill.intra.peff.net> (raw)
In-Reply-To: <xmqqbo3ou1ue.fsf@gitster.dls.corp.google.com>
On Thu, Sep 19, 2013 at 11:02:17AM -0700, Junio C Hamano wrote:
> Jeff King <peff@peff.net> writes:
>
> > An alternative would be to write the new entries to a temporary index
> > in memory. And then you can throw away the entries in the current index
> > that match the pathspec, and add in the entries from the temporary
> > index. I was just hoping that unpack-trees would do all of that for me.
> > :)
>
> Isn't a "go there" one-way merge with pathspecs very similar to what
> happens in "reset -- pathspec" except for the working tree part?
I thought so at first, but now I'm not so sure...
> suspect that it may be sufficient to mimic the read_from_tree() and
> adapt update_index_from_diff() callback in builtin/reset.c to also
> update the working tree (and we can do so unconditionally without
> checking if we have any local modification in this case, which
> simplifies things a lot), but I may be missing something.
It almost works to simply update the index as "reset" does via
diff_cache, marking each updated entry with CE_UPDATE, and then let the
rest of checkout_paths proceed, which handles updating the working tree
based on the new index.
But I found two problems:
1. The diff never feeds us entries that are unchanged, so we never
mark them for update. But that interferes with later code to check
whether our pathspecs matched anything (so we complain on "git
reset --hard; git checkout HEAD foo" would barf on the checkout,
since we do not need to touch foo).
But I think that points to a larger problem, which is that we do
not want to just look at the entries that are different between the
tree and the index. We also need to care about the entries that are
different in the working tree and index, because those need written
out, too.
2. The code in checkout_paths cannot handle the deletion for us,
because it doesn't even know about the path any more (we removed it
during the index diff). I think we could get around this by leaving
an entry with the CE_WT_REMOVE flag set. But it looks like there is
a bit more magic to removing a path than just remove_or_warn().
unpack-trees has unlink_entry, which queues up leading directories
for removal.
I think (2) is a matter of refactoring (but again, if we could convince
unpack-trees to do this for us, that might be the nicest way to reuse
the code). But (1) points to a larger problem in thinking about this as
a "diff"; it is really about re-loading bits of the index, and then
checking it out into the working tree.
-Peff
next prev parent reply other threads:[~2013-09-19 22:13 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-17 19:06 [BUG?] git checkout $commit -- somedir doesn't drop files Uwe Kleine-König
2013-09-17 19:58 ` Junio C Hamano
2013-09-17 20:13 ` Jeff King
2013-09-17 20:27 ` Junio C Hamano
2013-09-17 20:29 ` Jeff King
2013-09-17 20:40 ` Junio C Hamano
2013-09-17 21:21 ` Jeff King
2013-09-17 22:00 ` Junio C Hamano
2013-09-17 22:03 ` Jeff King
2013-09-17 22:14 ` Junio C Hamano
2013-09-19 7:46 ` Jeff King
2013-09-19 18:02 ` Junio C Hamano
2013-09-19 22:13 ` Jeff King [this message]
2013-09-20 22:54 ` Junio C Hamano
2013-09-17 20:10 ` Jeff King
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=20130919221323.GA18085@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=u.kleine-koenig@pengutronix.de \
/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).