Re: [RFC] shallow clone
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Jan 30, 2006, 11:39 UTC
- Message-ID
- <Pine.LNX.4.63.0601301220420.6424@wbgn013.biozentrum.uni-wuerzburg.de>
- In-Reply-To
- <7voe1uchet.fsf@assigned-by-dhcp.cox.net>
Hi,
On Sun, 29 Jan 2006, Junio C Hamano wrote:
Show 8 quoted lines
> Strategy > -------- > > We have `info/grafts` mechanism to fake parent information for > commit objects. Using this facility, we could roughly do: > > . Download the full tree for v2.6.14 commit and store its > objects locally.
On first read, I mistook "tree" for "commit"...
> . Set up `info/grafts` to lie to the local git that Linux kernel > history began at v2.6.14 version.
Maybe also record this in .git/config, so that you can
- disallow fetching from this repo, and - easily extend the shallow copy to a larger shallow one, or a full one.
> . Run `git fetch git://.../linux-2.6 master`, with a local ref > pointing at v2.6.14 commit, to pretend that we have everything > up to v2.6.14 to `upload-pack` running on the other end.
How about refs/tags/start_shallow?
Show 15 quoted lines
> . Update the `origin` branch with the master commit object name > we just fetched from Linus. > > Design > ------ > > [...] > > Another functionality we would need is to tell `upload-pack` to > use `info/grafts` of downloader's choice. With this, after > fetching the objects for v2.6.14 commit, the downloader can set > up its own grafts file to cauterize the development history at > v2.6.14, and tell the `upload-pack` to pretend the kernel > history starts at that commit, while sending the tip of Linus' > development track to us.
Why not just start another fetch? Then, "have <refs/tags/start_shallow>" would be sent, and upload-pack does the right thing?
If you absolutely want to get only one pack, which then is stored as-is, upload-pack could start two rev-list processes: one for the tree and one for all the rest.
Show 5 quoted lines
> [...] > > [NOTE] > Most likely this is not directly run by the user but is run as > the first command invoked by the shallow clone script.
Better make it an option to git-clone
Show 7 quoted lines
> 4. `upload-pack` notices this is a single commit request, and > sends an ACK if it can satisfy the request (or a NAK if it > can't, e.g. it does not have the asked commit). Instead of > doing the usual `get_common_commits` followed by > `create_pack_file`, it does: > > $ git rev-list -n1 --objects $commit | git pack-object
Here it could say
(git rev-list -n1 --objects $commit_since; git rev-list --objects ^$commit_since $commit) | git pack-object
If the former is still needed (e.g. for git-tar-remote-tree), we could distinguish "single <ref>" and "shallow <ref>" commands.
> [...] > > The second phase of the shallow clone is to fetch the history > since v2.6.14 to the tip.
As I outlined above, I don't see the need for this.
Ciao, Dscho