| Scalar | |
| ====== | |
| Scalar is a repository management tool that optimizes Git for use in large | |
| repositories. It accomplishes this by helping users to take advantage of | |
| advanced performance features in Git. Unlike most other Git built-in commands, | |
| Scalar is not executed as a subcommand of 'git'; rather, it is built as a | |
| separate executable containing its own series of subcommands. | |
| Background | |
| ---------- | |
| Scalar was originally designed as an add-on to Git and implemented as a .NET | |
| Core application. It was created based on the learnings from the VFS for Git | |
| project (another application aimed at improving the experience of working with | |
| large repositories). As part of its initial implementation, Scalar relied on | |
| custom features in the Microsoft fork of Git that have since been integrated | |
| into core Git: | |
| * partial clone, | |
| * commit graphs, | |
| * multi-pack index, | |
| * sparse checkout (cone mode), | |
| * scheduled background maintenance, | |
| * etc | |
| With the requisite Git functionality in place and a desire to bring the benefits | |
| of Scalar to the larger Git community, the Scalar application itself was ported | |
| from C# to C and integrated upstream. | |
| Features | |
| -------- | |
| Scalar is comprised of two major pieces of functionality: automatically | |
| configuring built-in Git performance features and managing repository | |
| enlistments. | |
| The Git performance features configured by Scalar (see "Background" for | |
| examples) confer substantial performance benefits to large repositories, but are | |
| either too experimental to enable for all of Git yet, or only benefit large | |
| repositories. As new features are introduced, Scalar should be updated | |
| accordingly to incorporate them. This will prevent the tool from becoming stale | |
| while also providing a path for more easily bringing features to the appropriate | |
| users. | |
| Enlistments are how Scalar knows which repositories on a user's system should | |
| utilize Scalar-configured features. This allows it to update performance | |
| settings when new ones are added to the tool, as well as centrally manage | |
| repository maintenance. The enlistment structure - a root directory with a | |
| `src/` subdirectory containing the cloned repository itself - is designed to | |
| encourage users to route build outputs outside of the repository to avoid the | |
| performance-limiting overhead of ignoring those files in Git. | |
| Design | |
| ------ | |
| Scalar is implemented in C and interacts with Git via a mix of child process | |
| invocations of Git and direct usage of `libgit.a`. Internally, it is structured | |
| much like other built-ins with subcommands (e.g., `git stash`), containing a | |
| `cmd_<subcommand>()` function for each subcommand, routed through a `cmd_main()` | |
| function. Most options are unique to each subcommand, with `scalar` respecting | |
| some "global" `git` options (e.g., `-c` and `-C`). | |
| Because `scalar` is not invoked as a Git subcommand (like `git scalar`), it is | |
| built and installed as its own executable in the `bin/` directory, alongside | |
| `git`, `git-gui`, etc. |