git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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

  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 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).