Skip to content

Releases: Red-Eyed/git-sfs

v2.0.0

Choose a tag to compare

@github-actions github-actions released this 26 Oct 11:23

Install

curl -fsSL https://github.com/Red-Eyed/git-sfs/releases/download/v2.0.0/install.sh | sh -s -- --version v2.0.0

Highlights

  • Install both git-sfs and rclone from prebuilt Python wheels for macOS and
    Linux on ARM64 and x86_64, with dependency notices and rebuildable sources.
  • Ship the Rust implementation as the stable git-sfs release line.
  • Make cache, remote, and installer writes atomic: bytes stage in project-owned
    temp locations and publish only after the producing operation completes.
  • Batch remote transfers and metadata checks through rclone instead of spawning
    one process per object.
  • Show rclone's live transfer progress, speed, and ETA during push and
    pull.
  • Show elapsed status spinners for long-running local work instead of leaving
    the terminal blank.

Backwards Incompatible Changes

Source Builds

Source builds use the Rust workspace

The repository now ships the Rust workspace as the maintained implementation.
Contributors building from source should use the Rust toolchain, cargo, and
the just recipes documented in docs/development.md. The retired source tree
and module files have been removed.

Configuration

config.toml is validated as a closed schema

Unknown top-level keys, unknown sections, unknown remote fields, and unknown
settings now fail validation. Local cache configuration is also rejected from
the committed config file. Remove misspelled or local-only keys before
upgrading.

Ambiguous string values are rejected

Values that would be read differently by the compatibility scanner and strict
TOML parsing now fail with an ambiguity error. For example, a quoted # inside
a remote path is reported instead of silently choosing one interpretation.
Rewrite the value to the path shown by the error before continuing.

Status Output

status --json represents unknown remote state explicitly

Remote lookup failures are no longer collapsed into false. JSON consumers
must handle a remote state that can be present, absent, or unknown with a cause.

Pull Integrity

Pull trusts successful rclone transfers by default

Earlier prereleases recalculated SHA-256 for every download after rclone had
finished, requiring a second complete disk read before adoption. Pull now
atomically renames completed staged files into the cache without rereading them.
Users who do not trust the remote or transport must run git-sfs pull --verify
to retain pre-adoption SHA-256 verification.

New Features

  • Import multiple sources expanded by shell wildcards into a directory, and
    accept directory destinations for single files while preserving filenames.
    Preview mappings, copy/move actions, file counts, and sizes with
    import --dry-run; the complete batch is validated before ingestion.
  • Evict cached bytes while preserving tracked symlinks with cache rm, or
    remove objects unreferenced by the working tree with cache prune. Both
    commands support --dry-run, validate selection first, and unlink objects
    atomically.
  • Add git-sfs self update to update both git-sfs and rclone with checksum
    verification and atomic binary replacement.
  • Add --pre to the installer and git-sfs self update to opt into eligible
    prerelease versions while keeping stable releases as the default.
  • Add git-sfs llms-txt for an offline, bundled reference document.
  • Add git-sfs doctor checks for repository, config, cache, version, rclone,
    and remote preconditions.
  • Add git-sfs status and git-sfs remotes JSON output for automation.
  • Add git-sfs verify --rehash and --rehash-sample for explicit cache-wide
    integrity audits.

Improvements

  • Default new cache bindings under the private Git directory so git clean -x
    does not remove unpushed cache objects.
  • Preserve existing cache bindings during setup, including the old
    .git-sfs/.cache location when no .git-sfs/cache symlink exists.
  • Make add, import, mv, pull, and byte-moving operations cancellable;
    interrupted writes leave no final partial cache object.
  • Stage push uploads under a remote temp prefix and publish final remote
    objects only after the batch transfer and size verification pass.
  • Stage pull downloads in cache-owned temp storage, then atomically adopt
    completed objects into the cache.
  • Show rclone's own transfer progress for push and pull, and silence it
    with --quiet.
  • Render rclone's full transfer progress in place by giving its stdout renderer
    a sized terminal instead of appending a new block for every refresh.
  • Show elapsed status spinners while scanning, hashing, verifying, importing,
    moving, setup, and self-update phases are running.
  • Skip downloading or hashing already-verified cache objects during ordinary
    pulls; writable cache objects are treated as unverified, hash-checked, and
    protected again.
  • Keep push, pull, status, and verify scoped to the requested path
    rather than scanning or transferring unrelated siblings.
  • Surface unreachable remotes as unavailable or unknown state instead of
    reporting an empty remote.
  • Retry only rclone's temporary-error exit class; permanent backend failures now
    fail promptly.

Bug Fixes

  • Let prerelease binaries satisfy older min_git_sfs_version floors while
    correctly remaining below the matching final release.
  • Refuse to convert files that are already tracked by Git when running
    git-sfs add.
  • Let a freshly initialized repository run local verification without requiring
    a configured remote.
  • Reject truncated or corrupt remote objects during remote integrity checks.
  • Prevent push from overwriting a good remote object with a protected local
    object whose bytes no longer match its hash.
  • Make import --move consume the source only after a verified cache object has
    been published, including cross-filesystem moves.
  • Make git-sfs mv rewrite relative symlink targets when moving files across
    directory depths.
  • Keep stale temp cleanup selective so one command does not remove another
    command's in-flight staging.

Performance

  • Use batched rclone copy --files-from transfers for push and pull.
  • Make -j and [settings].n_jobs cap rclone transfer concurrency and pull's
    bounded adoption workers.
  • Avoid a second complete disk read after pull unless --verify is requested.
  • Query remote metadata by requested object prefixes instead of listing the
    entire remote for small scoped operations.
  • Deduplicate work by object hash so identical file contents are stored,
    uploaded, and downloaded once.

Documentation

  • Replace rewrite-era documentation with stable contract, architecture,
    configuration, command, workflow, installation, and safety docs.
  • Reset the changelog for the stable release line.

Developers

  • Build all four distributable Python wheels into dist/ with just build
    on macOS; use just rust-build for the native Rust binary alone. Successful
    builds replace old artifacts, while failed builds preserve them.
  • Add the Rust workspace, release archive builder, installer path, and CI checks
    for the maintained implementation.
  • Publish semantic-version prerelease tags as non-latest GitHub prereleases and
    pin release-page install commands to the exact tag.
  • Accept both static ELF and static PIE descriptions when validating portable
    Linux release binaries.
  • Add the conformance harness for workflow parity, cancellation safety, cache
    mode behavior, lock contention, downgrade/round-trip behavior, and stable
    behavior coverage.

v2.0.0-rc.12

v2.0.0-rc.12 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Oct 07:43

Install

curl -fsSL https://github.com/Red-Eyed/git-sfs/releases/download/v2.0.0-rc.12/install.sh | sh -s -- --version v2.0.0-rc.12

Python wheels are attached for macOS and Linux on ARM64 and x86_64. Each wheel bundles both git-sfs and rclone, dependency license notices, corresponding rclone sources, and rebuild instructions. Download the wheel matching your platform and install it with uv tool install followed by its filename.

Changes since v2.0.0-rc.7

  • Import multiple sources, including shell-expanded wildcards: git sfs import /path/to/data/**/*.zip dst/. A single file can also target a directory while preserving its filename; explicit renaming still works.
  • Preview imports with git sfs import --dry-run: see source/destination mappings, copy/move actions, file counts, and logical sizes without hashing or modifying files. The whole batch is validated before ingest, including under --move.
  • Evict cached bytes while preserving tracked symlinks with git sfs cache rm <path>..., or remove objects unreferenced by the working tree with git sfs cache prune. Both commands support --dry-run and atomic per-object eviction.
  • Build all four Python wheels directly into dist/ with just build on macOS. Successful builds replace old distribution artifacts; failed builds preserve the previous output. Use just rust-build for the native Rust binary alone.

The bundled rclone omits optional cgo-based cmount integration. macOS wheels require macOS 12 or newer; Linux wheels support manylinux 2.17 and musllinux 1.2.

v2.0.0-rc.7

v2.0.0-rc.7 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 04 Sep 06:56

Install

curl -fsSL https://github.com/Red-Eyed/git-sfs/releases/download/v2.0.0-rc.7/install.sh | sh -s -- --version v2.0.0-rc.7

Highlights

  • Ship the Rust implementation as the stable git-sfs release line.
  • Make cache, remote, and installer writes atomic: bytes stage in project-owned
    temp locations and publish only after the producing operation completes.
  • Batch remote transfers and metadata checks through rclone instead of spawning
    one process per object.
  • Show rclone's live transfer progress, speed, and ETA during push and
    pull.
  • Show elapsed status spinners for long-running local work instead of leaving
    the terminal blank.

Backwards Incompatible Changes

Source Builds

Source builds use the Rust workspace

The repository now ships the Rust workspace as the maintained implementation.
Contributors building from source should use the Rust toolchain, cargo, and
the just recipes documented in docs/development.md. The retired source tree
and module files have been removed.

Configuration

config.toml is validated as a closed schema

Unknown top-level keys, unknown sections, unknown remote fields, and unknown
settings now fail validation. Local cache configuration is also rejected from
the committed config file. Remove misspelled or local-only keys before
upgrading.

Ambiguous string values are rejected

Values that would be read differently by the compatibility scanner and strict
TOML parsing now fail with an ambiguity error. For example, a quoted # inside
a remote path is reported instead of silently choosing one interpretation.
Rewrite the value to the path shown by the error before continuing.

Status Output

status --json represents unknown remote state explicitly

Remote lookup failures are no longer collapsed into false. JSON consumers
must handle a remote state that can be present, absent, or unknown with a cause.

Pull Integrity

Pull trusts successful rclone transfers by default

Earlier prereleases recalculated SHA-256 for every download after rclone had
finished, requiring a second complete disk read before adoption. Pull now
atomically renames completed staged files into the cache without rereading them.
Users who do not trust the remote or transport must run git-sfs pull --verify
to retain pre-adoption SHA-256 verification.

New Features

  • Add git-sfs self update to update both git-sfs and rclone with checksum
    verification and atomic binary replacement.
  • Add --pre to the installer and git-sfs self update to opt into eligible
    prerelease versions while keeping stable releases as the default.
  • Add git-sfs llms-txt for an offline, bundled reference document.
  • Add git-sfs doctor checks for repository, config, cache, version, rclone,
    and remote preconditions.
  • Add git-sfs status and git-sfs remotes JSON output for automation.
  • Add git-sfs verify --rehash and --rehash-sample for explicit cache-wide
    integrity audits.

Improvements

  • Default new cache bindings under the private Git directory so git clean -x
    does not remove unpushed cache objects.
  • Preserve existing cache bindings during setup, including the old
    .git-sfs/.cache location when no .git-sfs/cache symlink exists.
  • Make add, import, mv, pull, and byte-moving operations cancellable;
    interrupted writes leave no final partial cache object.
  • Stage push uploads under a remote temp prefix and publish final remote
    objects only after the batch transfer and size verification pass.
  • Stage pull downloads in cache-owned temp storage, then atomically adopt
    completed objects into the cache.
  • Show rclone's own transfer progress for push and pull, and silence it
    with --quiet.
  • Render rclone's full transfer progress in place by giving its stdout renderer
    a sized terminal instead of appending a new block for every refresh.
  • Show elapsed status spinners while scanning, hashing, verifying, importing,
    moving, setup, and self-update phases are running.
  • Skip downloading or hashing already-verified cache objects during ordinary
    pulls; writable cache objects are treated as unverified, hash-checked, and
    protected again.
  • Keep push, pull, status, and verify scoped to the requested path
    rather than scanning or transferring unrelated siblings.
  • Surface unreachable remotes as unavailable or unknown state instead of
    reporting an empty remote.
  • Retry only rclone's temporary-error exit class; permanent backend failures now
    fail promptly.

Bug Fixes

  • Let prerelease binaries satisfy older min_git_sfs_version floors while
    correctly remaining below the matching final release.
  • Refuse to convert files that are already tracked by Git when running
    git-sfs add.
  • Let a freshly initialized repository run local verification without requiring
    a configured remote.
  • Reject truncated or corrupt remote objects during remote integrity checks.
  • Prevent push from overwriting a good remote object with a protected local
    object whose bytes no longer match its hash.
  • Make import --move consume the source only after a verified cache object has
    been published, including cross-filesystem moves.
  • Make git-sfs mv rewrite relative symlink targets when moving files across
    directory depths.
  • Keep stale temp cleanup selective so one command does not remove another
    command's in-flight staging.

Performance

  • Use batched rclone copy --files-from transfers for push and pull.
  • Make -j and [settings].n_jobs cap rclone transfer concurrency and pull's
    bounded adoption workers.
  • Avoid a second complete disk read after pull unless --verify is requested.
  • Query remote metadata by requested object prefixes instead of listing the
    entire remote for small scoped operations.
  • Deduplicate work by object hash so identical file contents are stored,
    uploaded, and downloaded once.

Documentation

  • Replace rewrite-era documentation with stable contract, architecture,
    configuration, command, workflow, installation, and safety docs.
  • Reset the changelog for the stable release line.

Developers

  • Add the Rust workspace, release archive builder, installer path, and CI checks
    for the maintained implementation.
  • Publish semantic-version prerelease tags as non-latest GitHub prereleases and
    pin release-page install commands to the exact tag.
  • Accept both static ELF and static PIE descriptions when validating portable
    Linux release binaries.
  • Add the conformance harness for workflow parity, cancellation safety, cache
    mode behavior, lock contention, downgrade/round-trip behavior, and stable
    behavior coverage.

v2.0.0-rc.6

v2.0.0-rc.6 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Sep 09:31

Install

curl -fsSL https://github.com/Red-Eyed/git-sfs/releases/download/v2.0.0-rc.6/install.sh | sh -s -- --version v2.0.0-rc.6

Highlights

  • Ship the Rust implementation as the stable git-sfs release line.
  • Make cache, remote, and installer writes atomic: bytes stage in project-owned
    temp locations and publish only after verification.
  • Batch remote transfers and metadata checks through rclone instead of spawning
    one process per object.
  • Show rclone's live transfer progress, speed, and ETA during push and
    pull.
  • Show elapsed status spinners for long-running local work instead of leaving
    the terminal blank.

Backwards Incompatible Changes

Source Builds

Source builds use the Rust workspace

The repository now ships the Rust workspace as the maintained implementation.
Contributors building from source should use the Rust toolchain, cargo, and
the just recipes documented in docs/development.md. The retired source tree
and module files have been removed.

Configuration

config.toml is validated as a closed schema

Unknown top-level keys, unknown sections, unknown remote fields, and unknown
settings now fail validation. Local cache configuration is also rejected from
the committed config file. Remove misspelled or local-only keys before
upgrading.

Ambiguous string values are rejected

Values that would be read differently by the compatibility scanner and strict
TOML parsing now fail with an ambiguity error. For example, a quoted # inside
a remote path is reported instead of silently choosing one interpretation.
Rewrite the value to the path shown by the error before continuing.

Status Output

status --json represents unknown remote state explicitly

Remote lookup failures are no longer collapsed into false. JSON consumers
must handle a remote state that can be present, absent, or unknown with a cause.

New Features

  • Add git-sfs self update to update both git-sfs and rclone with checksum
    verification and atomic binary replacement.
  • Add --pre to the installer and git-sfs self update to opt into eligible
    prerelease versions while keeping stable releases as the default.
  • Add git-sfs llms-txt for an offline, bundled reference document.
  • Add git-sfs doctor checks for repository, config, cache, version, rclone,
    and remote preconditions.
  • Add git-sfs status and git-sfs remotes JSON output for automation.
  • Add git-sfs verify --rehash and --rehash-sample for explicit cache-wide
    integrity audits.

Improvements

  • Default new cache bindings under the private Git directory so git clean -x
    does not remove unpushed cache objects.
  • Preserve existing cache bindings during setup, including the old
    .git-sfs/.cache location when no .git-sfs/cache symlink exists.
  • Make add, import, mv, pull, and byte-moving operations cancellable;
    interrupted writes leave no final partial cache object.
  • Stage push uploads under a remote temp prefix and publish final remote
    objects only after the batch transfer and size verification pass.
  • Stage pull downloads in cache-owned temp storage, verify SHA-256, then adopt
    objects into the cache.
  • Show rclone's own transfer progress for push and pull, and silence it
    with --quiet.
  • Render rclone's full transfer progress in place by giving its stdout renderer
    a sized terminal instead of appending a new block for every refresh.
  • Show elapsed status spinners while scanning, hashing, verifying, importing,
    moving, setup, and self-update phases are running.
  • Skip downloading or hashing already-verified cache objects during ordinary
    pulls; writable cache objects are treated as unverified, hash-checked, and
    protected again.
  • Keep push, pull, status, and verify scoped to the requested path
    rather than scanning or transferring unrelated siblings.
  • Surface unreachable remotes as unavailable or unknown state instead of
    reporting an empty remote.
  • Retry only rclone's temporary-error exit class; permanent backend failures now
    fail promptly.

Bug Fixes

  • Let prerelease binaries satisfy older min_git_sfs_version floors while
    correctly remaining below the matching final release.
  • Refuse to convert files that are already tracked by Git when running
    git-sfs add.
  • Let a freshly initialized repository run local verification without requiring
    a configured remote.
  • Reject truncated or corrupt remote objects during remote integrity checks.
  • Prevent push from overwriting a good remote object with a protected local
    object whose bytes no longer match its hash.
  • Make import --move consume the source only after a verified cache object has
    been published, including cross-filesystem moves.
  • Make git-sfs mv rewrite relative symlink targets when moving files across
    directory depths.
  • Keep stale temp cleanup selective so one command does not remove another
    command's in-flight staging.

Performance

  • Use batched rclone copy --files-from transfers for push and pull.
  • Query remote metadata by requested object prefixes instead of listing the
    entire remote for small scoped operations.
  • Deduplicate work by object hash so identical file contents are stored,
    uploaded, and downloaded once.

Documentation

  • Replace rewrite-era documentation with stable contract, architecture,
    configuration, command, workflow, installation, and safety docs.
  • Reset the changelog for the stable release line.

Developers

  • Add the Rust workspace, release archive builder, installer path, and CI checks
    for the maintained implementation.
  • Publish semantic-version prerelease tags as non-latest GitHub prereleases and
    pin release-page install commands to the exact tag.
  • Accept both static ELF and static PIE descriptions when validating portable
    Linux release binaries.
  • Add the conformance harness for workflow parity, cancellation safety, cache
    mode behavior, lock contention, downgrade/round-trip behavior, and stable
    behavior coverage.

v2.0.0-rc.5

v2.0.0-rc.5 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Sep 08:56

Install

curl -fsSL https://github.com/Red-Eyed/git-sfs/releases/download/v2.0.0-rc.5/install.sh | sh -s -- --version v2.0.0-rc.5

Highlights

  • Ship the Rust implementation as the stable git-sfs release line.
  • Make cache, remote, and installer writes atomic: bytes stage in project-owned
    temp locations and publish only after verification.
  • Batch remote transfers and metadata checks through rclone instead of spawning
    one process per object.
  • Show rclone's live transfer progress, speed, and ETA during push and
    pull.
  • Show elapsed status spinners for long-running local work instead of leaving
    the terminal blank.

Backwards Incompatible Changes

Source Builds

Source builds use the Rust workspace

The repository now ships the Rust workspace as the maintained implementation.
Contributors building from source should use the Rust toolchain, cargo, and
the just recipes documented in docs/development.md. The retired source tree
and module files have been removed.

Configuration

config.toml is validated as a closed schema

Unknown top-level keys, unknown sections, unknown remote fields, and unknown
settings now fail validation. Local cache configuration is also rejected from
the committed config file. Remove misspelled or local-only keys before
upgrading.

Ambiguous string values are rejected

Values that would be read differently by the compatibility scanner and strict
TOML parsing now fail with an ambiguity error. For example, a quoted # inside
a remote path is reported instead of silently choosing one interpretation.
Rewrite the value to the path shown by the error before continuing.

Status Output

status --json represents unknown remote state explicitly

Remote lookup failures are no longer collapsed into false. JSON consumers
must handle a remote state that can be present, absent, or unknown with a cause.

New Features

  • Add git-sfs self update to update both git-sfs and rclone with checksum
    verification and atomic binary replacement.
  • Add --pre to the installer and git-sfs self update to opt into eligible
    prerelease versions while keeping stable releases as the default.
  • Add git-sfs llms-txt for an offline, bundled reference document.
  • Add git-sfs doctor checks for repository, config, cache, version, rclone,
    and remote preconditions.
  • Add git-sfs status and git-sfs remotes JSON output for automation.
  • Add git-sfs verify --rehash and --rehash-sample for explicit cache-wide
    integrity audits.

Improvements

  • Default new cache bindings under the private Git directory so git clean -x
    does not remove unpushed cache objects.
  • Preserve existing cache bindings during setup, including the old
    .git-sfs/.cache location when no .git-sfs/cache symlink exists.
  • Make add, import, mv, pull, and byte-moving operations cancellable;
    interrupted writes leave no final partial cache object.
  • Stage push uploads under a remote temp prefix and publish final remote
    objects only after the batch transfer and size verification pass.
  • Stage pull downloads in cache-owned temp storage, verify SHA-256, then adopt
    objects into the cache.
  • Show rclone's own transfer progress for push and pull, and silence it
    with --quiet.
  • Render rclone's full transfer progress in place instead of appending a new
    terminal block for every refresh.
  • Show elapsed status spinners while scanning, hashing, verifying, importing,
    moving, setup, and self-update phases are running.
  • Skip downloading or hashing already-verified cache objects during ordinary
    pulls; writable cache objects are treated as unverified, hash-checked, and
    protected again.
  • Keep push, pull, status, and verify scoped to the requested path
    rather than scanning or transferring unrelated siblings.
  • Surface unreachable remotes as unavailable or unknown state instead of
    reporting an empty remote.
  • Retry only rclone's temporary-error exit class; permanent backend failures now
    fail promptly.

Bug Fixes

  • Let prerelease binaries satisfy older min_git_sfs_version floors while
    correctly remaining below the matching final release.
  • Refuse to convert files that are already tracked by Git when running
    git-sfs add.
  • Let a freshly initialized repository run local verification without requiring
    a configured remote.
  • Reject truncated or corrupt remote objects during remote integrity checks.
  • Prevent push from overwriting a good remote object with a protected local
    object whose bytes no longer match its hash.
  • Make import --move consume the source only after a verified cache object has
    been published, including cross-filesystem moves.
  • Make git-sfs mv rewrite relative symlink targets when moving files across
    directory depths.
  • Keep stale temp cleanup selective so one command does not remove another
    command's in-flight staging.

Performance

  • Use batched rclone copy --files-from transfers for push and pull.
  • Query remote metadata by requested object prefixes instead of listing the
    entire remote for small scoped operations.
  • Deduplicate work by object hash so identical file contents are stored,
    uploaded, and downloaded once.

Documentation

  • Replace rewrite-era documentation with stable contract, architecture,
    configuration, command, workflow, installation, and safety docs.
  • Reset the changelog for the stable release line.

Developers

  • Add the Rust workspace, release archive builder, installer path, and CI checks
    for the maintained implementation.
  • Publish semantic-version prerelease tags as non-latest GitHub prereleases and
    pin release-page install commands to the exact tag.
  • Accept both static ELF and static PIE descriptions when validating portable
    Linux release binaries.
  • Add the conformance harness for workflow parity, cancellation safety, cache
    mode behavior, lock contention, downgrade/round-trip behavior, and stable
    behavior coverage.

v2.0.0-rc.4

v2.0.0-rc.4 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Sep 08:26

Install

curl -fsSL https://github.com/Red-Eyed/git-sfs/releases/download/v2.0.0-rc.4/install.sh | sh -s -- --version v2.0.0-rc.4

Highlights

  • Ship the Rust implementation as the stable git-sfs release line.
  • Make cache, remote, and installer writes atomic: bytes stage in project-owned
    temp locations and publish only after verification.
  • Batch remote transfers and metadata checks through rclone instead of spawning
    one process per object.
  • Show rclone's live transfer progress, speed, and ETA during push and
    pull.
  • Show elapsed status spinners for long-running local work instead of leaving
    the terminal blank.

Backwards Incompatible Changes

Source Builds

Source builds use the Rust workspace

The repository now ships the Rust workspace as the maintained implementation.
Contributors building from source should use the Rust toolchain, cargo, and
the just recipes documented in docs/development.md. The retired source tree
and module files have been removed.

Configuration

config.toml is validated as a closed schema

Unknown top-level keys, unknown sections, unknown remote fields, and unknown
settings now fail validation. Local cache configuration is also rejected from
the committed config file. Remove misspelled or local-only keys before
upgrading.

Ambiguous string values are rejected

Values that would be read differently by the compatibility scanner and strict
TOML parsing now fail with an ambiguity error. For example, a quoted # inside
a remote path is reported instead of silently choosing one interpretation.
Rewrite the value to the path shown by the error before continuing.

Status Output

status --json represents unknown remote state explicitly

Remote lookup failures are no longer collapsed into false. JSON consumers
must handle a remote state that can be present, absent, or unknown with a cause.

New Features

  • Add git-sfs self update to update both git-sfs and rclone with checksum
    verification and atomic binary replacement.
  • Add --pre to the installer and git-sfs self update to opt into eligible
    prerelease versions while keeping stable releases as the default.
  • Add git-sfs llms-txt for an offline, bundled reference document.
  • Add git-sfs doctor checks for repository, config, cache, version, rclone,
    and remote preconditions.
  • Add git-sfs status and git-sfs remotes JSON output for automation.
  • Add git-sfs verify --rehash and --rehash-sample for explicit cache-wide
    integrity audits.

Improvements

  • Default new cache bindings under the private Git directory so git clean -x
    does not remove unpushed cache objects.
  • Preserve existing cache bindings during setup, including the old
    .git-sfs/.cache location when no .git-sfs/cache symlink exists.
  • Make add, import, mv, pull, and byte-moving operations cancellable;
    interrupted writes leave no final partial cache object.
  • Stage push uploads under a remote temp prefix and publish final remote
    objects only after the batch transfer and size verification pass.
  • Stage pull downloads in cache-owned temp storage, verify SHA-256, then adopt
    objects into the cache.
  • Show rclone's own transfer progress for push and pull, and silence it
    with --quiet.
  • Show elapsed status spinners while scanning, hashing, verifying, importing,
    moving, setup, and self-update phases are running.
  • Skip downloading or hashing already-verified cache objects during ordinary
    pulls; writable cache objects are treated as unverified, hash-checked, and
    protected again.
  • Keep push, pull, status, and verify scoped to the requested path
    rather than scanning or transferring unrelated siblings.
  • Surface unreachable remotes as unavailable or unknown state instead of
    reporting an empty remote.
  • Retry only rclone's temporary-error exit class; permanent backend failures now
    fail promptly.

Bug Fixes

  • Let prerelease binaries satisfy older min_git_sfs_version floors while
    correctly remaining below the matching final release.
  • Refuse to convert files that are already tracked by Git when running
    git-sfs add.
  • Let a freshly initialized repository run local verification without requiring
    a configured remote.
  • Reject truncated or corrupt remote objects during remote integrity checks.
  • Prevent push from overwriting a good remote object with a protected local
    object whose bytes no longer match its hash.
  • Make import --move consume the source only after a verified cache object has
    been published, including cross-filesystem moves.
  • Make git-sfs mv rewrite relative symlink targets when moving files across
    directory depths.
  • Keep stale temp cleanup selective so one command does not remove another
    command's in-flight staging.

Performance

  • Use batched rclone copy --files-from transfers for push and pull.
  • Query remote metadata by requested object prefixes instead of listing the
    entire remote for small scoped operations.
  • Deduplicate work by object hash so identical file contents are stored,
    uploaded, and downloaded once.

Documentation

  • Replace rewrite-era documentation with stable contract, architecture,
    configuration, command, workflow, installation, and safety docs.
  • Reset the changelog for the stable release line.

Developers

  • Add the Rust workspace, release archive builder, installer path, and CI checks
    for the maintained implementation.
  • Publish semantic-version prerelease tags as non-latest GitHub prereleases and
    pin release-page install commands to the exact tag.
  • Accept both static ELF and static PIE descriptions when validating portable
    Linux release binaries.
  • Add the conformance harness for workflow parity, cancellation safety, cache
    mode behavior, lock contention, downgrade/round-trip behavior, and stable
    behavior coverage.

v2.0.0-rc.3

v2.0.0-rc.3 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Sep 08:08

Install

curl -fsSL https://github.com/Red-Eyed/git-sfs/releases/download/v2.0.0-rc.3/install.sh | sh -s -- --version v2.0.0-rc.3

Highlights

  • Ship the Rust implementation as the stable git-sfs release line.
  • Make cache, remote, and installer writes atomic: bytes stage in project-owned
    temp locations and publish only after verification.
  • Batch remote transfers and metadata checks through rclone instead of spawning
    one process per object.
  • Show rclone's live transfer progress, speed, and ETA during push and
    pull.
  • Show elapsed status spinners for long-running local work instead of leaving
    the terminal blank.

Backwards Incompatible Changes

Source Builds

Source builds use the Rust workspace

The repository now ships the Rust workspace as the maintained implementation.
Contributors building from source should use the Rust toolchain, cargo, and
the just recipes documented in docs/development.md. The retired source tree
and module files have been removed.

Configuration

config.toml is validated as a closed schema

Unknown top-level keys, unknown sections, unknown remote fields, and unknown
settings now fail validation. Local cache configuration is also rejected from
the committed config file. Remove misspelled or local-only keys before
upgrading.

Ambiguous string values are rejected

Values that would be read differently by the compatibility scanner and strict
TOML parsing now fail with an ambiguity error. For example, a quoted # inside
a remote path is reported instead of silently choosing one interpretation.
Rewrite the value to the path shown by the error before continuing.

Status Output

status --json represents unknown remote state explicitly

Remote lookup failures are no longer collapsed into false. JSON consumers
must handle a remote state that can be present, absent, or unknown with a cause.

New Features

  • Add git-sfs self update to update both git-sfs and rclone with checksum
    verification and atomic binary replacement.
  • Add --pre to the installer and git-sfs self update to opt into eligible
    prerelease versions while keeping stable releases as the default.
  • Add git-sfs llms-txt for an offline, bundled reference document.
  • Add git-sfs doctor checks for repository, config, cache, version, rclone,
    and remote preconditions.
  • Add git-sfs status and git-sfs remotes JSON output for automation.
  • Add git-sfs verify --rehash and --rehash-sample for explicit cache-wide
    integrity audits.

Improvements

  • Default new cache bindings under the private Git directory so git clean -x
    does not remove unpushed cache objects.
  • Preserve existing cache bindings during setup, including the old
    .git-sfs/.cache location when no .git-sfs/cache symlink exists.
  • Make add, import, mv, pull, and byte-moving operations cancellable;
    interrupted writes leave no final partial cache object.
  • Stage push uploads under a remote temp prefix and publish final remote
    objects only after the batch transfer and size verification pass.
  • Stage pull downloads in cache-owned temp storage, verify SHA-256, then adopt
    objects into the cache.
  • Show rclone's own transfer progress for push and pull, and silence it
    with --quiet.
  • Show elapsed status spinners while scanning, hashing, verifying, importing,
    moving, setup, and self-update phases are running.
  • Skip downloading or hashing already-verified cache objects during ordinary
    pulls; writable cache objects are treated as unverified, hash-checked, and
    protected again.
  • Keep push, pull, status, and verify scoped to the requested path
    rather than scanning or transferring unrelated siblings.
  • Surface unreachable remotes as unavailable or unknown state instead of
    reporting an empty remote.
  • Retry only rclone's temporary-error exit class; permanent backend failures now
    fail promptly.

Bug Fixes

  • Let prerelease binaries satisfy older min_git_sfs_version floors while
    correctly remaining below the matching final release.
  • Refuse to convert files that are already tracked by Git when running
    git-sfs add.
  • Let a freshly initialized repository run local verification without requiring
    a configured remote.
  • Reject truncated or corrupt remote objects during remote integrity checks.
  • Prevent push from overwriting a good remote object with a protected local
    object whose bytes no longer match its hash.
  • Make import --move consume the source only after a verified cache object has
    been published, including cross-filesystem moves.
  • Make git-sfs mv rewrite relative symlink targets when moving files across
    directory depths.
  • Keep stale temp cleanup selective so one command does not remove another
    command's in-flight staging.

Performance

  • Use batched rclone copy --files-from transfers for push and pull.
  • Query remote metadata by requested object prefixes instead of listing the
    entire remote for small scoped operations.
  • Deduplicate work by object hash so identical file contents are stored,
    uploaded, and downloaded once.

Documentation

  • Replace rewrite-era documentation with stable contract, architecture,
    configuration, command, workflow, installation, and safety docs.
  • Reset the changelog for the stable release line.

Developers

  • Add the Rust workspace, release archive builder, installer path, and CI checks
    for the maintained implementation.
  • Publish semantic-version prerelease tags as non-latest GitHub prereleases and
    pin release-page install commands to the exact tag.
  • Accept both static ELF and static PIE descriptions when validating portable
    Linux release binaries.
  • Add the conformance harness for workflow parity, cancellation safety, cache
    mode behavior, lock contention, downgrade/round-trip behavior, and stable
    behavior coverage.

v2.0.0-rc.2

v2.0.0-rc.2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 18 Aug 07:56

Install

curl -fsSL https://github.com/Red-Eyed/git-sfs/releases/download/v2.0.0-rc.2/install.sh | sh -s -- --version v2.0.0-rc.2

Highlights

  • Ship the Rust implementation as the stable git-sfs release line.
  • Make cache, remote, and installer writes atomic: bytes stage in project-owned
    temp locations and publish only after verification.
  • Batch remote transfers and metadata checks through rclone instead of spawning
    one process per object.
  • Show rclone's live transfer progress, speed, and ETA during push and
    pull.
  • Show elapsed status spinners for long-running local work instead of leaving
    the terminal blank.

Backwards Incompatible Changes

Source Builds

Source builds use the Rust workspace

The repository now ships the Rust workspace as the maintained implementation.
Contributors building from source should use the Rust toolchain, cargo, and
the just recipes documented in docs/development.md. The retired source tree
and module files have been removed.

Configuration

config.toml is validated as a closed schema

Unknown top-level keys, unknown sections, unknown remote fields, and unknown
settings now fail validation. Local cache configuration is also rejected from
the committed config file. Remove misspelled or local-only keys before
upgrading.

Ambiguous string values are rejected

Values that would be read differently by the compatibility scanner and strict
TOML parsing now fail with an ambiguity error. For example, a quoted # inside
a remote path is reported instead of silently choosing one interpretation.
Rewrite the value to the path shown by the error before continuing.

Status Output

status --json represents unknown remote state explicitly

Remote lookup failures are no longer collapsed into false. JSON consumers
must handle a remote state that can be present, absent, or unknown with a cause.

New Features

  • Add git-sfs self update to update both git-sfs and rclone with checksum
    verification and atomic binary replacement.
  • Add --pre to the installer and git-sfs self update to opt into eligible
    prerelease versions while keeping stable releases as the default.
  • Add git-sfs llms-txt for an offline, bundled reference document.
  • Add git-sfs doctor checks for repository, config, cache, version, rclone,
    and remote preconditions.
  • Add git-sfs status and git-sfs remotes JSON output for automation.
  • Add git-sfs verify --rehash and --rehash-sample for explicit cache-wide
    integrity audits.

Improvements

  • Default new cache bindings under the private Git directory so git clean -x
    does not remove unpushed cache objects.
  • Preserve existing cache bindings during setup, including the old
    .git-sfs/.cache location when no .git-sfs/cache symlink exists.
  • Make add, import, mv, pull, and byte-moving operations cancellable;
    interrupted writes leave no final partial cache object.
  • Stage push uploads under a remote temp prefix and publish final remote
    objects only after the batch transfer and size verification pass.
  • Stage pull downloads in cache-owned temp storage, verify SHA-256, then adopt
    objects into the cache.
  • Show rclone's own transfer progress for push and pull, and silence it
    with --quiet.
  • Show elapsed status spinners while scanning, hashing, verifying, importing,
    moving, setup, and self-update phases are running.
  • Skip downloading or hashing already-verified cache objects during ordinary
    pulls; writable cache objects are treated as unverified, hash-checked, and
    protected again.
  • Keep push, pull, status, and verify scoped to the requested path
    rather than scanning or transferring unrelated siblings.
  • Surface unreachable remotes as unavailable or unknown state instead of
    reporting an empty remote.
  • Retry only rclone's temporary-error exit class; permanent backend failures now
    fail promptly.

Bug Fixes

  • Let prerelease binaries satisfy older min_git_sfs_version floors while
    correctly remaining below the matching final release.
  • Refuse to convert files that are already tracked by Git when running
    git-sfs add.
  • Let a freshly initialized repository run local verification without requiring
    a configured remote.
  • Reject truncated or corrupt remote objects during remote integrity checks.
  • Prevent push from overwriting a good remote object with a protected local
    object whose bytes no longer match its hash.
  • Make import --move consume the source only after a verified cache object has
    been published, including cross-filesystem moves.
  • Make git-sfs mv rewrite relative symlink targets when moving files across
    directory depths.
  • Keep stale temp cleanup selective so one command does not remove another
    command's in-flight staging.

Performance

  • Use batched rclone copy --files-from transfers for push and pull.
  • Query remote metadata by requested object prefixes instead of listing the
    entire remote for small scoped operations.
  • Deduplicate work by object hash so identical file contents are stored,
    uploaded, and downloaded once.

Documentation

  • Replace rewrite-era documentation with stable contract, architecture,
    configuration, command, workflow, installation, and safety docs.
  • Reset the changelog for the stable release line.

Developers

  • Add the Rust workspace, release archive builder, installer path, and CI checks
    for the maintained implementation.
  • Publish semantic-version prerelease tags as non-latest GitHub prereleases and
    pin release-page install commands to the exact tag.
  • Accept both static ELF and static PIE descriptions when validating portable
    Linux release binaries.
  • Add the conformance harness for workflow parity, cancellation safety, cache
    mode behavior, lock contention, downgrade/round-trip behavior, and stable
    behavior coverage.

v1.22.0

Choose a tag to compare

@github-actions github-actions released this 20 Jul 14:58

Install

curl -fsSL https://github.com/Red-Eyed/git-sfs/releases/download/v1.22.0/install.sh | sh

Added

  • git-sfs push [path] — push now takes an optional path argument, matching pull and status. Only symlinks below that path are uploaded. Previously push always scanned the whole repository and aborted on the first hash with no local cache file, which made a partially-pulled repository impossible to push from: subtrees the user deliberately never pulled are dangling symlinks, and they blocked the upload of every file that was cached. Defaults to ., so existing behavior is unchanged.
  • git-sfs push --skip-missing — uploads the files that are cached instead of failing on the first one that is not. Intended for the case where missing files are scattered rather than confined to a subtree, so no single path argument selects the cached ones. Off by default: a push that omits files still exits 0, so the remote silently becomes an incomplete copy. Skipped paths are reported on stderr, and a remote written this way should be treated as partial until a full git-sfs push succeeds.

Fixed

  • missing cached file now names the file. The error reported only a bare 64-character hash, which gave no indication of which tracked file was affected or how to fix it. It now reports the working-tree path, a short hash, and the git-sfs pull command that restores it.

v1.21.0

Choose a tag to compare

@github-actions github-actions released this 29 Jun 09:16

Install

curl -fsSL https://github.com/Red-Eyed/git-sfs/releases/download/v1.21.0/install.sh | sh

Added

  • git-sfs llms-txt — new subcommand that prints a fully self-contained LLM reference document embedded in the binary. Covers the core model, all commands, configuration, env vars, workflows, and safety notes. Works entirely offline; no network access required.
  • llms.txt at repo root — LLM-friendly reference for agents browsing the GitHub repo before installing git-sfs. Generated by scripts/gen_llms_txt.py from the existing docs; regenerate with just gen-llms-txt when docs change.
  • skills/git-sfs/ Agent Skill — a Claude Code agent skill (SKILL.md) that users can copy to ~/.claude/skills/git-sfs/ (global) or .claude/skills/git-sfs/ (project) to give their coding agent context about git-sfs. When triggered, the skill runs git-sfs llms-txt for the full embedded reference.