Skip to content

Commit ad3eef3

Browse files
committed
Add readme
1 parent f14b7e3 commit ad3eef3

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed

README.md

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# Partial Submodules for Git
2+
3+
**git-partial-submodule** is a command-line script for setting up and working with submodules while
4+
enabling them to use git's [partial clone](https://github.blog/2020-12-21-get-up-to-speed-with-partial-clone-and-shallow-clone/)
5+
and [sparse checkout](https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/)
6+
features.
7+
8+
In top-level repositories, git provides various partial-clone options such as "blobless" clone, which
9+
reduce the burden of downloading large repositories. For submodules, only "shallow" clones are
10+
supported by git, but shallow clones have usability issues that make the resulting repo difficult to
11+
work with. **git-partial-submodule** clones your submodules as blobless repos, leaving them fully
12+
functional while saving bandwidth and disk space compared to a full clone.
13+
14+
Similarly, top-level repositories support sparse checkout, which lets you cut down the worktree to
15+
just the files you're interested in. This is particularly relevant for submodules, as their
16+
repositories often contain extra contents such as tests, examples, ancillary tools, and suchlike
17+
that we don't need if we just want to use the submodule as a library in our project.
18+
**git-partial-submodule** stores sparse checkout patterns in `.gitmodules`, so they can be managed
19+
under version control and automatically applied when the submodules are cloned.
20+
21+
## Prerequisites
22+
23+
* git 2.27.0 or later
24+
* Python 3.8 or later
25+
26+
## Installation
27+
28+
**git-partial-submodule** is a single-file Python script. [Download the script](https://github.com/Reedbeta/git-partial-submodule/blob/main/git-partial-submodule.py)
29+
and put it somewhere in your `PATH`, or add it to your repository. Or add this repository as a
30+
submodule.
31+
32+
## Usage
33+
34+
```
35+
git-partial-submodule.py add [-b BRANCH] [--name NAME] [--sparse] <repository> <path>
36+
git-partial-submodule.py clone [<path>...]
37+
git-partial-submodule.py save-sparse [<path>...]
38+
git-partial-submodule.py restore-sparse [<path>...]
39+
```
40+
41+
### Add
42+
43+
Creates and clones a new submodule, much like `git submodule add`, but performs a blobless clone.
44+
If `--sparse` is specified, also enables sparse checkout on the new submodule, with the default
45+
pattern set of `/* !/*/`.
46+
47+
### Clone
48+
49+
Use this to initialize submodules after a fresh clone of the superproject. Performs blobless clones
50+
of any submodules that are not already cloned. Also applies any sparse checkout patterns specified
51+
in `.gitmodules`.
52+
53+
### Save-Sparse
54+
55+
After making changes to the sparse patterns in a submodule, use this to save them to `.gitmodules`.
56+
Patterns are stored space-delimited in the `sparse-checkout` property.
57+
58+
### Restore-Sparse
59+
60+
Reapplies the sparse patterns saved in `.gitmodules` to the actual submodules. Use this after
61+
pulling or switching branches, etc.
62+
63+
## Limitations and Cautions
64+
65+
Partial clone and sparse checkout are both still experimental git features that may have sharp
66+
edges.
67+
68+
This tool works by fiddling with the internals of your repository in not-officially-supported ways,
69+
so it might fail or do the wrong thing in some edge cases I haven't considered (and might leave your
70+
repo in a bad state afterward).
71+
72+
Not all of the various command-line options to the underlying `git clone`, `git submodule add`, etc.
73+
are supported.
74+
75+
"Cone" mode for sparse checkout is not currently supported.
76+
77+
Spaces in sparse checkout patterns are not currently handled correctly.

0 commit comments

Comments
 (0)