Thread (27 messages) flat view 27 messages, 6 authors, 2016-06-15

Re: [RFC PATCH 00/12] Sparse checkout

From: Nguyen Thai Ngoc Duy <hidden>
Date: 2016-06-15 22:45:00

On 7/24/08, James Pickens [off-list ref] wrote:
Nguyen Thai Ngoc Duy <pclouds <at> gmail.com> writes:

 > I have not looked at non-builtin commands yet, but I think it's not
 > a big deal. We have several rounds before this series is good enough ;)
 > So in short, sparse prefix will be stored in config, core.sparsecheckout.
 > you have three new commands to enter/update/leave sparse checkout:
 >
 > git clone --path=prefix       # clone with sparse checkout
 > git checkout --path=prefix    # limit/update checkout paths
 > git checkout --full           # stop sparse checkout
 >


First things first, thanks a lot for working on this feature.  I have an
 enormous project in CVS (144GB repo, containing 65000 directories and
 463000 files) that I've been wanting to convert to git for a while now,
 and the lack of sparse checkouts was the only thing about git that was
 standing in the way.  The project is so big that checking out the whole
 tree all the time is unworkable, and I think my coworkers would hang me
 if I tried to make them use submodules.  We already use sparse checkouts
 in CVS to make it manageable, so sparse checkout support in git would
 vastly simplify the transition.

 I played around with the patch briefly, and I have a couple of comments
 on the interface.

 First, I would want a capability to checkout a directory non-recursively.
 I.e., checkout directory A/B, without also checking out directory A/B/C.
 Perhaps a modifier could be added to a path element to make it
 non-recursive.
This one is difficult (and may probably produce more intrusive patch).
Let's see what I can do.
 Second, I would want a capability to checkout and release directories
 incrementally, similar to how we do it in cvs.  For example, I might do
 the following in cvs:

 $ cvs co -l A         # Checkout dir A non-recursively
 $ cd A
 $ cvs up -l -d B1 B2  # Checkout dirs A/B1 and A/B2 non-recursively
 $ cd B1
 $ cvs up -d C1 C2     # Checkout dirs A/B1/C1 and A/B1/C2 recursively
 (Oops, didn't need C2)
 $ cvs release -d C2
 At this point I would have the following directory tree, assuming the C1
 directory in the repo contained a D1 directory:

 A/
 A/B1/
 A/B1/C1/
 A/B1/C1/D1/
 A/B2/

 A similar capability in git would be much appreciated.
You can do that with "git checkout --path" (non-recursive checkout aside):

$ git checkout --path=A                     # checkout full A
$ git checkout --path=A/B1/C1               # no, limit to A/B1/C1 only
$ git checkout --path=A/B1/C1:A/B2          # extend to A/B2 too
 Finally, I noticed what I think is a bug: if you do a partial checkout of
 a non-existing directory, you just get an empty tree.  I would expect to
 get an error message in that case.
Thanks.
 I hope this is helpful, and thanks again for working on this.

 James



 --
 To unsubscribe from this list: send the line "unsubscribe git" in
 the body of a message to majordomo@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Duy
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help