Thread (14 messages) 14 messages, 4 authors, 2016-06-15

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help