{"id":51053390,"url":"https://github.com/eersnington/fcl","last_synced_at":"2026-06-22T19:03:46.292Z","repository":{"id":366597928,"uuid":"1276864331","full_name":"eersnington/fcl","owner":"eersnington","description":"(f)aster git (cl)one","archived":false,"fork":false,"pushed_at":"2026-06-22T14:59:58.000Z","size":52,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-22T15:08:14.357Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eersnington.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-22T11:11:11.000Z","updated_at":"2026-06-22T15:01:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/eersnington/fcl","commit_stats":null,"previous_names":["eersnington/fcl"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/eersnington/fcl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eersnington%2Ffcl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eersnington%2Ffcl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eersnington%2Ffcl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eersnington%2Ffcl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eersnington","download_url":"https://codeload.github.com/eersnington/fcl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eersnington%2Ffcl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34661709,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-22T19:03:44.956Z","updated_at":"2026-06-22T19:03:46.282Z","avatar_url":"https://github.com/eersnington.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# fcl\n\n\u003e **Warning: experimental repository**\n\u003e\n\u003e `fcl` is not ready for general use. The clone format it writes is a normal Git repository, but the implementation, CLI output, benchmark numbers, and supported platforms may change without notice.\n\n`fcl` is a Rust implementation of full Git clone.\n\n- native Smart HTTP Git protocol v2\n- full branch and tag fetches\n- native pack receive, indexing, and delta resolution\n- streaming checkout from pack-backed object storage\n- local copy-on-write clone mode for existing repos\n- benchmark harness against `git clone`\n\nNo shallow clone. No default blob filter. No archive-only checkout.\n\n## Install\n\n```bash\ncargo build -p fcl --release\n```\n\nThe binary is written to:\n\n```bash\ntarget/release/fcl\n```\n\n## Platforms\n\n| Platform | Remote clone | `fcl local` backend | Notes |\n| --- | --- | --- | --- |\n| macOS | HTTPS Git protocol v2 | APFS clonefile via `reflink-copy` | Tested during development. |\n| Linux | HTTPS Git protocol v2 | `FICLONE` via `reflink-copy` | Requires reflink-capable filesystem for `fcl local`. |\n| Windows | Not supported | Not supported | No Windows path yet. |\n\n## CLI\n\n### Remote clone\n\n```bash\nfcl https://github.com/octocat/Hello-World.git hello\n```\n\nThe target is a regular Git repository:\n\n```bash\ngit -C hello fsck --full\ngit -C hello status --short\ngit -C hello diff --exit-code HEAD\n```\n\nRemote clone currently supports public HTTPS remotes that speak Git protocol v2. SSH URLs and private repositories are not supported yet.\n\n### Local copy-on-write clone\n\n```bash\nfcl local ./source-repo ./target-repo\n```\n\n`fcl local` copies an existing repository using filesystem copy-on-write. It is for cases where the repo is already on disk and another self-contained copy is needed quickly.\n\nCurrent behavior:\n\n- requires a `.git` directory in the source\n- rejects linked worktrees with `.git` files\n- rejects merge, rebase, cherry-pick, revert, bisect, and Git lock states\n- requires source and target on the same filesystem\n- rejects special filesystem entries\n- does not fall back to slow recursive copy\n\n### Benchmark\n\n```bash\nfcl bench https://github.com/cloudflare/workerd.git --runs 1 --compare-git --validate --csv\n```\n\n`--validate` runs:\n\n```bash\ngit fsck --full\ngit status --short\ngit diff --exit-code HEAD\n```\n\n## Early benchmark\n\nSingle macOS sample against `cloudflare/workerd`:\n\n| Tool | Time |\n| --- | ---: |\n| `fcl` | 9.42s |\n| `git clone` | 9.37s |\n\n`fcl` phase breakdown from the same run:\n\n| Phase | Time |\n| --- | ---: |\n| discovery | 0.70s |\n| fetch | 5.99s |\n| ingest | 2.47s |\n| checkout | 0.13s |\n\nWorkload:\n\n```text\nrepo: cloudflare/workerd\npack: 51.3 MB\nfiles checked out: 2365\ndirectories created: 259\n```\n\nRemote clone timings vary a lot. Run multiple samples before comparing changes.\n\n## Storage model\n\nRemote clone path:\n\n```text\ndiscover refs\n  -\u003e fetch pack\n  -\u003e validate pack checksum\n  -\u003e parse pack frames\n  -\u003e resolve deltas\n  -\u003e write .idx\n  -\u003e write refs/config/HEAD\n  -\u003e build checkout manifest\n  -\u003e stream blobs into working tree\n  -\u003e write .git/index\n```\n\nCheckout does not carry regular file blob bytes in the manifest. Manifest entries store path, mode, object id, and size. File contents are streamed from the object reader.\n\nObject data states:\n\n```text\nResident\nSpilled\nReconstructable\n```\n\nBlobs are usually reconstructable from pack metadata. `FCL_SPILL_BLOBS=1` can be used to exercise spill storage.\n\n## Environment\n\nSafety caps:\n\n```bash\nFCL_MAX_PACK_BYTES=200000000\nFCL_MAX_OBJECTS=500000\nFCL_MAX_TEMP_BYTES=1000000000\nFCL_MAX_SPILL_BYTES=1000000000\n```\n\nCheckout and object storage:\n\n```bash\nFCL_CHECKOUT_JOBS=8\nFCL_OBJECT_CACHE_BYTES=536870912\nFCL_SPILL_BLOBS=1\nFCL_SPILL_DIR=/tmp/fcl-spill\nFCL_LOW_MEMORY=1\n```\n\nHTTP:\n\n```bash\nFCL_HTTP1_ONLY=1\nFCL_HICKORY_DNS=1\nFCL_NO_PROGRESS=1\nFCL_FETCH_RETRIES=2\nFCL_PACK_WRITE_BUFFER=1048576\nFCL_USER_AGENT=git/2.45.0\nFCL_CONNECT_TIMEOUT_SECS=10\nFCL_REQUEST_TIMEOUT_SECS=300\nFCL_POOL_IDLE_TIMEOUT_SECS=4\n```\n\n## Repository layout\n\n- `crates/core`: protocol, pack ingest, object reader, checkout, local CoW clone.\n- `crates/cli`: CLI and benchmark runner.\n\n## Development\n\n```bash\ncargo test --workspace\ncargo clippy --workspace --all-targets --all-features -- -D warnings\n```\n\nSee [`specs.md`](./specs.md) for requirements and call graphs.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feersnington%2Ffcl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feersnington%2Ffcl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feersnington%2Ffcl/lists"}