| 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. |