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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html