From: Michael Haggerty <mhagger@alum.mit.edu>
To: Jeff King <peff@peff.net>
Cc: Junio C Hamano <gitster@pobox.com>, git@vger.kernel.org
Subject: Re: [PATCH] disable grafts during fetch/push/bundle
Date: Thu, 06 Mar 2014 17:41:27 +0100 [thread overview]
Message-ID: <5318A537.4010400@alum.mit.edu> (raw)
In-Reply-To: <20140306155626.GB18519@sigill.intra.peff.net>
On 03/06/2014 04:56 PM, Jeff King wrote:
> On Thu, Mar 06, 2014 at 09:42:46AM +0100, Michael Haggerty wrote:
>
>> Replace objects are better than grafts in *almost* every dimension. The
>> exception is that it is dead simple to create grafts, whereas I always
>> have to break open the man pages to remember how to create a replace
>> object that does the same thing.
>>
>> So I think a helpful step towards deprecating grafts would be to offer a
>> couple of convenience features to help people kick the "grafts" habit:
>
> I agree that better tool support would make "git replace" more pleasant
> to use.
>
>> * A tool that converts grafts (i.e., the grafts read from
>> $GIT_DIR/info/grafts) into the equivalent replacements.
>
> I don't know if this is strictly necessary, if we make your command
> below pleasant to use. I.e., it should just be:
>
> while read sha1 parents; do
> git replace --graft $sha1 $parents
> done <.git/info/grafts
>
> We can wrap that in "git replace --convert-grafts", but I do not think
> grafts are so common that there would be a big demand for it.
It's probably easier to wrap it than to explain to Windows users what
they have to do.
>> * A tool that creates a new replacement object that is the equivalent of
>> a graft. I.e., it should do, using replace references, the equivalent
>> of the following command:
>>
>> echo SHA1 [PARENT1...] >>$GIT_DIR/info/grafts
>>
>> These features could be added to "git replace" or could be built into a
>> new "git grafts" command.
>
> I think it would be nice to have a set of "mode" options for
> "git-replace" to do basic editing of a sha1 and install the result
> (technically you could split the editing into a separate command, but I
> do not see the point in editing a sha1 and then _not_ replacing it).
If modifying without replacing is needed, it would be pretty easy to add
an option --stdout that writes the SHA1 of the modified object to stdout
instead of creating a replace reference. That way what you want 95% of
the time is the default but there is still an escape hatch.
> Perhaps:
>
> # pretty-print sha1 based on type, start $EDITOR, create a
> # type-appropriate object from the result (e.g., using hash-object,
> # mktree, or mktag), and then set up the object as a replacement for
> # SHA1
> git replace --edit SHA1
>
> # ditto, but replace the $EDITOR step with the parent list
> git replace --graft SHA1 PARENT1 PARENT2
>
> # ...or remove entries from a tree
> git replace --remove-entry SHA1 foo bar
I like this idea a lot, especially the pretty-printer round-tripping.
"git replace" could support some of the options that "git filter-branch"
can take, like --env-filter, --msg-filter, etc. (at least if the target
is a commit object).
All of this would make it possible to build up the changes that you want
to integrate via "filter-branch" piecemeal instead of having to have a
single monster filter-branch invocation. For example,
for c in $(git rev-list --all --before=2007-01-01
--author=root@localhost)
do
git replace --env-filter 'export AUTHOR_EMAIL=john@example.com' $c
done
# Make some more changes to other commits...
# And when everything is done and checked:
git filter-branch --all --tag-name-filter=cat
To me this is easier to construct than the equivalent filter-branch
invocation, and can be faster because its processing can be more easily
limited to the commits that need it. Of course to really gain speed,
there should be a C program that bakes in replace references by
traversing the object tree rather than processing each commit
separately, like filter-branch. I predict that this approach would have
most of the speed of BFG.
Michael
--
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/
next prev parent reply other threads:[~2014-03-06 16:41 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-04 17:48 [PATCH] disable grafts during fetch/push/bundle Jeff King
2014-03-04 20:52 ` Junio C Hamano
2014-03-05 0:56 ` Jeff King
2014-03-05 18:49 ` Junio C Hamano
2014-03-05 18:52 ` Jeff King
2014-03-05 19:18 ` Junio C Hamano
2014-03-05 19:28 ` Jeff King
2014-03-05 20:24 ` Junio C Hamano
2014-03-06 8:42 ` Michael Haggerty
2014-03-06 9:17 ` Christian Couder
2014-03-06 15:56 ` Jeff King
2014-03-06 16:41 ` Michael Haggerty [this message]
2014-03-06 17:48 ` Jeff King
2014-03-06 17:49 ` [RFC/PATCH 1/4] replace: refactor command-mode determination Jeff King
2014-03-06 17:49 ` [RFC/PATCH 2/4] replace: use OPT_CMDMODE to handle modes Jeff King
[not found] ` <CAP8UFD2c0UKT8Uyw4j9SzKGx2oLn=o7N-dtvQHPaaBtLT6ggcw@mail.gmail.com>
2014-03-06 18:48 ` Jeff King
2014-03-06 17:49 ` [RFC/PATCH 3/4] replace: factor object resolution out of replace_object Jeff King
2014-03-06 17:51 ` [RFC/PATCH 4/4] replace: add --edit option Jeff King
2014-03-07 1:57 ` Eric Sunshine
2014-03-07 17:17 ` Jeff King
2014-03-06 19:00 ` [PATCH] disable grafts during fetch/push/bundle Junio C Hamano
2014-03-06 19:07 ` Jeff King
2014-03-06 23:01 ` Philip Oakley
2014-03-06 23:29 ` Michael Haggerty
2014-03-06 23:39 ` Junio C Hamano
2014-03-07 7:08 ` Christian Couder
2014-03-07 17:19 ` Jeff King
2014-03-19 22:39 ` Junio C Hamano
2014-03-21 0:49 ` Jeff King
2014-03-06 23:48 ` Philip Oakley
2014-03-04 23:36 ` Eric Sunshine
2014-03-05 0:37 ` Jeff King
2014-03-05 1:00 ` Eric Sunshine
2014-03-05 1:05 ` Jeff King
2014-03-05 1:07 ` Eric Sunshine
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=5318A537.4010400@alum.mit.edu \
--to=mhagger@alum.mit.edu \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=peff@peff.net \
/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.