Re: [RFC] shallow clone
flat view
From: Johannes Schindelin <hidden>
Date: 2016-06-15 22:42:17
Hi, On Sun, 29 Jan 2006, Junio C Hamano wrote:
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?
. 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.
[...] [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
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