From: David Aguilar <davvid@gmail.com>
To: Manuel Reimer <Manuel.Spam@nurfuerspam.de>
Cc: git@vger.kernel.org, Junio C Hamano <gitster@pobox.com>
Subject: Re: Where is information of "git read-tree" stored?
Date: Sun, 25 Sep 2011 03:30:45 +0200 [thread overview]
Message-ID: <20110925013043.GB19780@gmail.com> (raw)
In-Reply-To: <7vobyg89rh.fsf@alter.siamese.dyndns.org>
On Mon, Sep 19, 2011 at 03:09:22PM -0700, Junio C Hamano wrote:
>
> To a certain degree, the point of a tool is that the user does not need to
> know about the details, but if you are interested...
git-subtree allows you to not have to know about the details:
https://github.com/apenwarr/git-subtree
https://github.com/apenwarr/git-subtree/blob/master/git-subtree.txt
git-subtree, combined with Junio's wonderful write-up below,
should get you on the right track.
> Suppose you have this tree structure in your "original" project:
>
> Documentation/README.txt
> hello.c
> Makefile
>
> and then somebody else has this structure in his project (in your case, it
> may happen to be stored in SVN but once it is slurped in a git repository,
> it does not matter):
>
> goodbye.c
> Makefile
>
> Further suppose that you would want to end up with this tree structure:
>
> Documentation/README.txt
> Makefile
> hello.c
> imported/Makefile
> imported/goodbye.c
>
> i.e. you would want to move stuff that came from the other project in imported/
> hierarchy. There may be many other files, and even subdirectories, in the
> other project, but they all are shifted one level down and placed in imported/
> hierarchy.
>
> The first four steps of the howto is to create such a final tree structure
> and make a merge commit out of that tree.
>
> After you update your project (which now has both the original files such
> as hello.c etc., may have added new files, and may even have updated stuff
> inside imported/ hierarchy) and the other side updated their project (e.g.
> it may have updated goodbye.c whose change you would want to carry over to
> your imported/goodbye.c, or it may have added a new file welcome.c, which
> you would want to import as imported/welcome.c), you would invoke "pull -s
> subtree", which in turn runs "merge -s subtree".
>
> The subtree strategy first compares the shapes of two trees being merged,
> and tries to find how much they have to be shifted to match. Your tree
> may now have:
>
> Documentation/README.txt
> Makefile
> hello.h (added)
> hello.c
> imported/Makefile
> imported/goodbye.c
>
> while the other side may now have:
>
> goodbye.c
> Makefile
> welcome.c
>
> The subtree strategy notices that by prefixing "imported/" in front of the
> paths, the tree from the other side will match the shape of the subtree
> you have under "imported/". Thus it can pair:
>
> their "goodbye.c" with your "imported/goodbye.c"
> their "Makefile" with your "imported/Makefile"
> their "welcome.c" with your "imported/welcome.c"
>
> and merge the changes. The common ancestor commit of this merge will be
> the initial merge you made with the first 4-step, so the three-way merge
> logic would notice that there wasn't "welcome.c" in the beginning, they
> added that path, while you did not do anything to the path that
> corresponds to it (namely, "imported/welcome.c"), so the new "welcome.c"
> file from the other project would simply be copied as "imported/welcome.c"
> to your tree, and the change they made to "goodbye.c" and your changes you
> made to your "imported/goodbye.c" will be merged and result is recorded in
> your "imported/goodbye.c".
>
> If "compares the shape and figures out how much to shift" makes you feel
> uneasy (and it probably should), you can give an explicit directory prefix
> as the backend option "subtree" (see "git merge help" for details).
--
David
prev parent reply other threads:[~2011-09-25 1:30 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-19 8:46 Where is information of "git read-tree" stored? Manuel Reimer
2011-09-19 17:36 ` Junio C Hamano
2011-09-19 19:52 ` Manuel Reimer
2011-09-19 22:09 ` Junio C Hamano
2011-09-25 1:30 ` David Aguilar [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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110925013043.GB19780@gmail.com \
--to=davvid@gmail.com \
--cc=Manuel.Spam@nurfuerspam.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.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).