From: Michael J Gruber <git@drmicha.warpmail.net>
To: "Boyd Stephen Smith Jr." <bss03@volumehost.net>
Cc: git@vger.kernel.org
Subject: Re: Grafting mis-aligned trees.
Date: Tue, 02 Dec 2008 17:20:58 +0100 [thread overview]
Message-ID: <4935606A.8050906@drmicha.warpmail.net> (raw)
In-Reply-To: <200811281701.46778.bss03@volumehost.net>
Boyd Stephen Smith Jr. venit, vidit, dixit 29.11.2008 00:01:
> On Tuesday 2008 November 18 03:24, Michael J Gruber wrote:
>> Boyd Stephen Smith Jr. venit, vidit, dixit 17.11.2008 23:45:
>>> I haven't gotten a response from my subscription email, so please CC me
>>> on any replies.
>>>
>>> So, I've been managaing the source I had from a client project in git and
>>> have a non-linear history. Currently, two tips (production and testing)
>>> but there are many feature branches that were git-merge'd in, not
>>> rebased.
>>>
>>> Now, I've gotten the full tree. Turns out all the source code I was
>>> working on was in a subdirectory "project/web". I'd like to "graft" the
>>> *changes* I made onto the full tree.
>>>
>>> I figured this might be a job for git-filter-branch. Certainly, that did
>>> the job of moving all my changes into the subdirectory. But, now I want
>>> to do something that's a combination or git-rebase and git-filter-branch.
>>> I want to replay the *patches/deltas* (like rebase) on top of the full
>>> tree I have, but *maintain the non-liear history* (like filter-branch).
>>>
>>> Can anyone think of a recipe for me?
>>>
>>> Trees look something like this right now.
>>>
>>> <some history> -> FT
>>>
>>> TI -> <non-linear history> -> A -> <non-linear history> -> C
>>> \ \ \
>>> -> PI ------------------------> B ------------------------> D
>>>
>>> I'd like to have it look something like:
>>>
>>> <some history> -> FT -> <non-linear history> -> A' -> <non-linear
>>> history> -> C' \ \ \
>>> -> PI' ----------------------> B' -----------------------> D'
>>>
>>> A', B', C', and D' are different commits, but the diff (and history)
>>> between FT and A' is the same as the diff (and history) between TI and A.
>>>
>>> Again, please CC me on any replies.
>> [CCing is customary here anyways.]
>>
>> So, your base directory for TI and FT is different, right? I.e.: In the
>> TI repo, your project sits at the root, whereas in the FT repo it sits
>> in project/web?
>
> Yes.
>
>> Has FT advanced since you took the initial subdir
>> snapshot for TI?
>
> No. Well, maybe. I think the subdir diff is fairly trivial if not empty. TI
> is an import from the code actually present on the testing server. FT was
> the a subversion repository obtained later after some hullabaloo with the
> ex-development house.
>
> Right now this tree is effectively all mine, so I can always graft in commits
> to synchronize the common subtree of FT and TI, if that makes things easier.
OK, here's a possibly primitive solution, but it works with my little
toy model of your layout:
- filter-branch your TI branches so that they are in the proper subdir
(you did that already)
- take a snapshot (say ftstuff.tar) of everything in FT's head (assuming
this is where TI branched off, or else take that point) *but exclude
project/web*
- using filter-branch again, rewrite your TI branches to contain those
missing FT files:
git filter-branch --tree-filter 'tar -xf /tmp/ftstuff.tar && git add .'
-f -- ti/master ti/whatever
Now your TI branches produce the same diffs as before, but are based on
the full tree. You can happily graft FT's head onto TI's root as a parent.
In fact those two should produce no diff in between them, so you might
as well get rid of one of them.
[cleaning out refs/original and repack -adf might be in order afterwards]
The tree-filter part feels hacky but does the job (probably with -f). I
don't think a subtree merge can do what you want.
Cheers,
Michael
next prev parent reply other threads:[~2008-12-02 16:22 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-11-17 22:45 Grafting mis-aligned trees Boyd Stephen Smith Jr.
2008-11-18 9:24 ` Michael J Gruber
2008-11-28 23:01 ` Boyd Stephen Smith Jr.
2008-12-02 16:20 ` Michael J Gruber [this message]
2008-12-02 17:19 ` Boyd Stephen Smith Jr.
2008-12-02 17:38 ` Michael J Gruber
2008-12-02 18:28 ` Boyd Stephen Smith Jr.
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=4935606A.8050906@drmicha.warpmail.net \
--to=git@drmicha.warpmail.net \
--cc=bss03@volumehost.net \
--cc=git@vger.kernel.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.
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.