From: skillzero@gmail.com
To: Avery Pennarun <apenwarr@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: Subtree merging of sub-directories between repositories?
Date: Sun, 2 Aug 2009 11:05:43 -0700 [thread overview]
Message-ID: <2729632a0908021105m10bfb8ddx700464d06fd38023@mail.gmail.com> (raw)
In-Reply-To: <32541b130908020130q11f1fa03yca276ab86c2ea4d5@mail.gmail.com>
On Sun, Aug 2, 2009 at 1:30 AM, Avery Pennarun<apenwarr@gmail.com> wrote:
> On Sun, Aug 2, 2009 at 2:37 AM, <skillzero@gmail.com> wrote:
>> Is it possible to use the subtree merge strategy to import just one
>> directory from a repository into a directory of a different
>> repository? The subtree merge example describes bringing in an entire
>> repository as a directory, but I'm not sure how to adapt that to just
>> import part of the source repository. The repositories are completely
>> different, but repository A has a couple directories I want to import
>> into repository B (along with the history that affected those
>> directories). I may also make changes on either side and it would be
>> nice to be able to re-merge in either direction.
>>
>> I was thinking I might need something like the git-subtree script, but
>> maybe this can be done with standard git commands?
>
> git tracks the history of the entire tree, not each subtree. So if
> you use the existing set of commit objects in A, then you'll pull in
> *all* the files of A.
>
> You have basically two choices here:
>
> 1) Merge the *entire* history of project A into project B, and during
> the merge, delete the files you don't want. (This will result in a
> repo that's about the size of A+B, even if you only keep 1% of the
> files, and every change to every file in A will now show up in B's
> history.) Merging future changes from A to B will be relatively easy
> (although you'll get conflicts on those files you deleted), but
> merging from B back to A will probably make a mess.
>
> 2) Use "git subtree split" to take the subdir of A and give it a
> history of its own, then merge that history into a subdir of B (using
> "git subtree add" or any other subtree merge method you want to use).
> You can then git subtree split/merge back and forth between A and B in
> the future to copy future changes from one to the other.
>
> The disadvantage of #2 is that git subtree ends up creating new "fake"
> commit objects for your new shared subproject. If you merge the new
> subproject back into A, you'll end up with some duplicate commit
> messages (unless you use --squash).
Thanks for the help. I tried #2 and it sort of worked. The history was
imported, but the resulting paths were flattened. Here's what I did:
From repository 1:
git subtree split --prefix=A/B/C --rejoin
... printed commit ID 11f1ef890c49634e822a40a818a6ac88bfc50f07
From repository 2:
git remote add -f Repo1 /path/to/repo/1
git subtree add --prefix=X/Y/C 11f1ef890c49634e822a40a818a6ac88bfc50f07
If I do 'git log X/Y/C', I only see a single commit:
Add 'X/Y/C/' from commit '11f1ef890c49634e822a40a818a6ac88bfc50f07'
git-subtree-dir: X/Y/C
git-subtree-mainline: 8b07aa647895aa8a7597dc545821bfd195ecaf7f
git-subtree-split: 11f1ef890c49634e822a40a818a6ac88bfc50f07
The full history doesn't seem to be associated with that directory. If
I do 'git log --name-only --topo-order', I see the full history, but
the files are listed as:
file.c
and I was expecting to see:
X/Y/C/file.c
Because I'd want to be able to do 'git log X/Y/C' and see all the
commits that affect that directory.
Is there a way to import such that the relative paths are retained? So
for the above example, since file.c came from A/B/C/file.c in the
original repository, I'd want it to show up in the log for
X/Y/C/file.c.
next prev parent reply other threads:[~2009-08-02 18:06 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-02 6:37 Subtree merging of sub-directories between repositories? skillzero
2009-08-02 8:30 ` Avery Pennarun
2009-08-02 18:05 ` skillzero [this message]
2009-08-02 18:53 ` Avery Pennarun
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=2729632a0908021105m10bfb8ddx700464d06fd38023@mail.gmail.com \
--to=skillzero@gmail.com \
--cc=apenwarr@gmail.com \
--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).