threads / discuss / 25948

Splitting up a repository

Subject: Splitting up a repository

## tl;dr

6 messages between Dec 4, 2010 and Dec 4, 2010.

replies: 5people: 3as markdown or json

Evan Driscoll· Dec 4, 2010, 05:27 UTC · lore

Say I have a repo where there are directories repo/foo, repo/bar, repo/baz. 'foo', 'bar', and 'baz' are loosely related -- closely enough that I put them together initially, but loosely enough that I now wish I could check out just 'repo/foo'. Since Git doesn't support partial checkouts (a bit annoying!), I now have to split this repository into separate ones. I'd of course like to keep history.

Is there a better way than making several (recursive) copies of the repository, deleting all but one directory in each copy, then moving the contents of that directory up a level? (And perhaps setting up a Git superproject at the original location. I do know about that.)

I've probably spent more time typing up this email than it would take to do, but I'm curious if there's some git magic or something that would be better for some reason. :-)

Evan
Jeff King· Dec 4, 2010, 05:33 UTC · re: Evan Driscoll · lore

Re: Splitting up a repository

On Fri, Dec 03, 2010 at 11:27:57PM -0600, Evan Driscoll wrote:
Show 11 quoted lines
> Say I have a repo where there are directories repo/foo, repo/bar,
> repo/baz. 'foo', 'bar', and 'baz' are loosely related -- closely enough
> that I put them together initially, but loosely enough that I now wish I
> could check out just 'repo/foo'. Since Git doesn't support partial
> checkouts (a bit annoying!), I now have to split this repository into
> separate ones. I'd of course like to keep history.
> 
> Is there a better way than making several (recursive) copies of the
> repository, deleting all but one directory in each copy, then moving the
> contents of that directory up a level? (And perhaps setting up a Git
> superproject at the original location. I do know about that.)

Rewrite the history of each directory with git-filter-branch. It even has a "--subdirectory-filter" option that will do exactly what you want.

-Peff
Evan Driscoll· Dec 4, 2010, 06:19 UTC · re: Jeff King · lore

Re: Splitting up a repository

On 12/3/2010 23:33, Jeff King wrote:
Show 7 quoted lines
>> Is there a better way than making several (recursive) copies of the
>> repository, deleting all but one directory in each copy, then moving the
>> contents of that directory up a level? (And perhaps setting up a Git
>> superproject at the original location. I do know about that.)
> 
> Rewrite the history of each directory with git-filter-branch. It even
> has a "--subdirectory-filter" option that will do exactly what you want.

Great, thanks. I had to mess around with a submodule that was inside one of the subdirectories that didn't make it through the history rewrite, and I could see that have getting slightly hairy, but at least in my case it was pretty simple. Other than that, worked like a charm.

Evan
Nguyen Thai Ngoc Duy· Dec 4, 2010, 07:09 UTC · re: Evan Driscoll · lore

Re: Splitting up a repository

On Sat, Dec 4, 2010 at 12:27 PM, Evan Driscoll <driscoll@cs.wisc.edu> wrote:
Show 5 quoted lines
> Say I have a repo where there are directories repo/foo, repo/bar,
> repo/baz. 'foo', 'bar', and 'baz' are loosely related -- closely enough
> that I put them together initially, but loosely enough that I now wish I
> could check out just 'repo/foo'. Since Git doesn't support partial
> checkouts (a bit annoying!),

Um.. it does support partial checkouts (check out man page of git-read-tree, sparse checkout section). But you must do a full clone (i.e. your repository will have bar and baz, even if you only checkout foo).

-- 
Duy
Evan Driscoll· Dec 4, 2010, 07:14 UTC · re: Nguyen Thai Ngoc Duy · lore

Re: Splitting up a repository

On 12/4/2010 1:09, Nguyen Thai Ngoc Duy wrote:
Show 11 quoted lines
> On Sat, Dec 4, 2010 at 12:27 PM, Evan Driscoll <driscoll@cs.wisc.edu> wrote:
>> Say I have a repo where there are directories repo/foo, repo/bar,
>> repo/baz. 'foo', 'bar', and 'baz' are loosely related -- closely enough
>> that I put them together initially, but loosely enough that I now wish I
>> could check out just 'repo/foo'. Since Git doesn't support partial
>> checkouts (a bit annoying!),
> 
> Um.. it does support partial checkouts (check out man page of
> git-read-tree, sparse checkout section). But you must do a full clone
> (i.e. your repository will have bar and baz, even if you only checkout
> foo).
That's sort of spiffy, and I did not know about that. So again, thanks.

That said, I did a bit of reading around, and I'm not sure it does what I need. http://stackoverflow.com/questions/2336580/sparse-checkout-in-git-1-7-0 is basically what I want, and the answers seem to indicate it isn't possible. (In other words, in my example, when I want a checkout of repo/foo, the .git directory needs to be a sibling of foo's contents, not a sibling of foo.)

Evan
Nguyen Thai Ngoc Duy· Dec 4, 2010, 07:41 UTC · re: Evan Driscoll · lore

Re: Splitting up a repository

On Sat, Dec 4, 2010 at 2:14 PM, Evan Driscoll <driscoll@cs.wisc.edu> wrote:
Show 22 quoted lines
> On 12/4/2010 1:09, Nguyen Thai Ngoc Duy wrote:
>> On Sat, Dec 4, 2010 at 12:27 PM, Evan Driscoll <driscoll@cs.wisc.edu> wrote:
>>> Say I have a repo where there are directories repo/foo, repo/bar,
>>> repo/baz. 'foo', 'bar', and 'baz' are loosely related -- closely enough
>>> that I put them together initially, but loosely enough that I now wish I
>>> could check out just 'repo/foo'. Since Git doesn't support partial
>>> checkouts (a bit annoying!),
>>
>> Um.. it does support partial checkouts (check out man page of
>> git-read-tree, sparse checkout section). But you must do a full clone
>> (i.e. your repository will have bar and baz, even if you only checkout
>> foo).
>
> That's sort of spiffy, and I did not know about that. So again, thanks.
>
> That said, I did a bit of reading around, and I'm not sure it does what
> I need.
> http://stackoverflow.com/questions/2336580/sparse-checkout-in-git-1-7-0
> is basically what I want, and the answers seem to indicate it isn't
> possible. (In other words, in my example, when I want a checkout of
> repo/foo, the .git directory needs to be a sibling of foo's contents,
> not a sibling of foo.)

If you want different layout too, then no it does not do that. Splitting repo is probably best.

-- 
Duy

← back to recent threads