<titledata-rh="true">Overview | Sparo</title><metadata-rh="true"name="viewport"content="width=device-width,initial-scale=1"><metadata-rh="true"name="twitter:card"content="summary_large_image"><metadata-rh="true"property="og:image"content="https://tiktok.github.io/sparo/images/site/sparo-ograph.png"><metadata-rh="true"name="twitter:image"content="https://tiktok.github.io/sparo/images/site/sparo-ograph.png"><metadata-rh="true"property="og:url"content="https://tiktok.github.io/sparo/pages/ci_commands/overview/"><metadata-rh="true"property="og:locale"content="en"><metadata-rh="true"name="docusaurus_locale"content="en"><metadata-rh="true"name="docsearch:language"content="en"><metadata-rh="true"name="docusaurus_version"content="current"><metadata-rh="true"name="docusaurus_tag"content="docs-default-current"><metadata-rh="true"name="docsearch:version"content="current"><metadata-rh="true"name="docsearch:docusaurus_tag"content="docs-default-current"><metadata-rh="true"property="og:title"content="Overview | Sparo"><metadata-rh="true"name="description"content="Everyday development involves a variety of Git operations such as switching between branches, fetching incremental changes from the server, and browsing history. By contrast, when a continuous integration (CI) pipeline checks out a Git branch, it is typically a much simpler operation. The folder or entire virtual machine image may be discarded as soon as the job completes. Therefore, different approaches for optimizing Git require required for these two use cases."><metadata-rh="true"property="og:description"content="Everyday development involves a variety of Git operations such as switching between branches, fetching incremental changes from the server, and browsing history. By contrast, when a continuous integration (CI) pipeline checks out a Git branch, it is typically a much simpler operation. The folder or entire virtual machine image may be discarded as soon as the job completes. Therefore, different approaches for optimizing Git require required for these two use cases."><linkdata-rh="true"rel="icon"href="/sparo/images/site/sparo-favicon.ico"><linkdata-rh="true"rel="canonical"href="https://tiktok.github.io/sparo/pages/ci_commands/overview/"><linkdata-rh="true"rel="alternate"href="https://tiktok.github.io/sparo/pages/ci_commands/overview/"hreflang="en"><linkdata-rh="true"rel="alternate"href="https://tiktok.github.io/sparo/pages/ci_commands/overview/"hreflang="x-default"><linkrel="stylesheet"href="/sparo/assets/css/styles.391b5f94.css">
<p>Sparo provides a separate command line <code>sparo-ci</code> that is specifically optimized for CI pipelines. The current implementation takes this approach:</p>
<ul>
<li>
<p>It uses <ahref="https://github.blog/2020-12-21-get-up-to-speed-with-partial-clone-and-shallow-clone/"target="_blank"rel="noopener noreferrer">treeless clone</a> instead of <strong>blobless clone</strong>, under the assumption that Git history will be rarely needed.</p>
<p><em>Shallow clone is a common alternative, however it has trouble supporting operations such as incremental build or publishing that require comparison with a base branch.</em></p>