|  | Shallow commits | 
|  | =============== | 
|  |  | 
|  | .Definition | 
|  | ********************************************************* | 
|  | Shallow commits do have parents, but not in the shallow | 
|  | repo, and therefore grafts are introduced pretending that | 
|  | these commits have no parents. | 
|  | ********************************************************* | 
|  |  | 
|  | The basic idea is to write the SHA-1s of shallow commits into | 
|  | $GIT_DIR/shallow, and handle its contents like the contents | 
|  | of $GIT_DIR/info/grafts (with the difference that shallow | 
|  | cannot contain parent information). | 
|  |  | 
|  | This information is stored in a new file instead of grafts, or | 
|  | even the config, since the user should not touch that file | 
|  | at all (even throughout development of the shallow clone, it | 
|  | was never manually edited!). | 
|  |  | 
|  | Each line contains exactly one SHA-1. When read, a commit_graft | 
|  | will be constructed, which has nr_parent < 0 to make it easier | 
|  | to discern from user provided grafts. | 
|  |  | 
|  | Since fsck-objects relies on the library to read the objects, | 
|  | it honours shallow commits automatically. | 
|  |  | 
|  | There are some unfinished ends of the whole shallow business: | 
|  |  | 
|  | - maybe we have to force non-thin packs when fetching into a | 
|  | shallow repo (ATM they are forced non-thin). | 
|  |  | 
|  | - A special handling of a shallow upstream is needed. At some | 
|  | stage, upload-pack has to check if it sends a shallow commit, | 
|  | and it should send that information early (or fail, if the | 
|  | client does not support shallow repositories). There is no | 
|  | support at all for this in this patch series. | 
|  |  | 
|  | - Instead of locking $GIT_DIR/shallow at the start, just | 
|  | the timestamp of it is noted, and when it comes to writing it, | 
|  | a check is performed if the mtime is still the same, dying if | 
|  | it is not. | 
|  |  | 
|  | - It is unclear how "push into/from a shallow repo" should behave. | 
|  |  | 
|  | - If you deepen a history, you'd want to get the tags of the | 
|  | newly stored (but older!) commits. This does not work right now. | 
|  |  | 
|  | To make a shallow clone, you can call "git-clone --depth 20 repo". | 
|  | The result contains only commit chains with a length of at most 20. | 
|  | It also writes an appropriate $GIT_DIR/shallow. | 
|  |  | 
|  | You can deepen a shallow repository with "git-fetch --depth 20 | 
|  | repo branch", which will fetch branch from repo, but stop at depth | 
|  | 20, updating $GIT_DIR/shallow. | 
|  |  | 
|  | The special depth 2147483647 (or 0x7fffffff, the largest positive | 
|  | number a signed 32-bit integer can contain) means infinite depth. |