Repository navigation
Releases: Red-Eyed/git-sfs
Release list
v2.0.0
Install
curl -fsSL https://github.com/Red-Eyed/git-sfs/releases/download/v2.0.0/install.sh | sh -s -- --version v2.0.0Highlights
- 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-sfsrelease 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
pushand
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 withcache prune. Both
commands support--dry-run, validate selection first, and unlink objects
atomically. - Add
git-sfs self updateto update bothgit-sfsandrclonewith checksum
verification and atomic binary replacement. - Add
--preto the installer andgit-sfs self updateto opt into eligible
prerelease versions while keeping stable releases as the default. - Add
git-sfs llms-txtfor an offline, bundled reference document. - Add
git-sfs doctorchecks for repository, config, cache, version, rclone,
and remote preconditions. - Add
git-sfs statusandgit-sfs remotesJSON output for automation. - Add
git-sfs verify --rehashand--rehash-samplefor 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/.cachelocation when no.git-sfs/cachesymlink exists. - Make
add,import,mv,pull, and byte-moving operations cancellable;
interrupted writes leave no final partial cache object. - Stage
pushuploads under a remote temp prefix and publish final remote
objects only after the batch transfer and size verification pass. - Stage
pulldownloads in cache-owned temp storage, then atomically adopt
completed objects into the cache. - Show rclone's own transfer progress for
pushandpull, 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, andverifyscoped 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_versionfloors 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
pushfrom overwriting a good remote object with a protected local
object whose bytes no longer match its hash. - Make
import --moveconsume the source only after a verified cache object has
been published, including cross-filesystem moves. - Make
git-sfs mvrewrite 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-fromtransfers for push and pull. - Make
-jand[settings].n_jobscap rclone transfer concurrency and pull's
bounded adoption workers. - Avoid a second complete disk read after pull unless
--verifyis 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/withjust build
on macOS; usejust rust-buildfor 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
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.12Python 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 withgit sfs cache prune. Both commands support--dry-runand atomic per-object eviction. - Build all four Python wheels directly into
dist/withjust buildon macOS. Successful builds replace old distribution artifacts; failed builds preserve the previous output. Usejust rust-buildfor 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
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.7Highlights
- Ship the Rust implementation as the stable
git-sfsrelease 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
pushand
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 updateto update bothgit-sfsandrclonewith checksum
verification and atomic binary replacement. - Add
--preto the installer andgit-sfs self updateto opt into eligible
prerelease versions while keeping stable releases as the default. - Add
git-sfs llms-txtfor an offline, bundled reference document. - Add
git-sfs doctorchecks for repository, config, cache, version, rclone,
and remote preconditions. - Add
git-sfs statusandgit-sfs remotesJSON output for automation. - Add
git-sfs verify --rehashand--rehash-samplefor 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/.cachelocation when no.git-sfs/cachesymlink exists. - Make
add,import,mv,pull, and byte-moving operations cancellable;
interrupted writes leave no final partial cache object. - Stage
pushuploads under a remote temp prefix and publish final remote
objects only after the batch transfer and size verification pass. - Stage
pulldownloads in cache-owned temp storage, then atomically adopt
completed objects into the cache. - Show rclone's own transfer progress for
pushandpull, 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, andverifyscoped 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_versionfloors 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
pushfrom overwriting a good remote object with a protected local
object whose bytes no longer match its hash. - Make
import --moveconsume the source only after a verified cache object has
been published, including cross-filesystem moves. - Make
git-sfs mvrewrite 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-fromtransfers for push and pull. - Make
-jand[settings].n_jobscap rclone transfer concurrency and pull's
bounded adoption workers. - Avoid a second complete disk read after pull unless
--verifyis 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
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.6Highlights
- Ship the Rust implementation as the stable
git-sfsrelease 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
pushand
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 updateto update bothgit-sfsandrclonewith checksum
verification and atomic binary replacement. - Add
--preto the installer andgit-sfs self updateto opt into eligible
prerelease versions while keeping stable releases as the default. - Add
git-sfs llms-txtfor an offline, bundled reference document. - Add
git-sfs doctorchecks for repository, config, cache, version, rclone,
and remote preconditions. - Add
git-sfs statusandgit-sfs remotesJSON output for automation. - Add
git-sfs verify --rehashand--rehash-samplefor 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/.cachelocation when no.git-sfs/cachesymlink exists. - Make
add,import,mv,pull, and byte-moving operations cancellable;
interrupted writes leave no final partial cache object. - Stage
pushuploads under a remote temp prefix and publish final remote
objects only after the batch transfer and size verification pass. - Stage
pulldownloads in cache-owned temp storage, verify SHA-256, then adopt
objects into the cache. - Show rclone's own transfer progress for
pushandpull, 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, andverifyscoped 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_versionfloors 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
pushfrom overwriting a good remote object with a protected local
object whose bytes no longer match its hash. - Make
import --moveconsume the source only after a verified cache object has
been published, including cross-filesystem moves. - Make
git-sfs mvrewrite 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-fromtransfers 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
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.5Highlights
- Ship the Rust implementation as the stable
git-sfsrelease 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
pushand
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 updateto update bothgit-sfsandrclonewith checksum
verification and atomic binary replacement. - Add
--preto the installer andgit-sfs self updateto opt into eligible
prerelease versions while keeping stable releases as the default. - Add
git-sfs llms-txtfor an offline, bundled reference document. - Add
git-sfs doctorchecks for repository, config, cache, version, rclone,
and remote preconditions. - Add
git-sfs statusandgit-sfs remotesJSON output for automation. - Add
git-sfs verify --rehashand--rehash-samplefor 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/.cachelocation when no.git-sfs/cachesymlink exists. - Make
add,import,mv,pull, and byte-moving operations cancellable;
interrupted writes leave no final partial cache object. - Stage
pushuploads under a remote temp prefix and publish final remote
objects only after the batch transfer and size verification pass. - Stage
pulldownloads in cache-owned temp storage, verify SHA-256, then adopt
objects into the cache. - Show rclone's own transfer progress for
pushandpull, 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, andverifyscoped 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_versionfloors 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
pushfrom overwriting a good remote object with a protected local
object whose bytes no longer match its hash. - Make
import --moveconsume the source only after a verified cache object has
been published, including cross-filesystem moves. - Make
git-sfs mvrewrite 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-fromtransfers 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
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.4Highlights
- Ship the Rust implementation as the stable
git-sfsrelease 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
pushand
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 updateto update bothgit-sfsandrclonewith checksum
verification and atomic binary replacement. - Add
--preto the installer andgit-sfs self updateto opt into eligible
prerelease versions while keeping stable releases as the default. - Add
git-sfs llms-txtfor an offline, bundled reference document. - Add
git-sfs doctorchecks for repository, config, cache, version, rclone,
and remote preconditions. - Add
git-sfs statusandgit-sfs remotesJSON output for automation. - Add
git-sfs verify --rehashand--rehash-samplefor 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/.cachelocation when no.git-sfs/cachesymlink exists. - Make
add,import,mv,pull, and byte-moving operations cancellable;
interrupted writes leave no final partial cache object. - Stage
pushuploads under a remote temp prefix and publish final remote
objects only after the batch transfer and size verification pass. - Stage
pulldownloads in cache-owned temp storage, verify SHA-256, then adopt
objects into the cache. - Show rclone's own transfer progress for
pushandpull, 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, andverifyscoped 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_versionfloors 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
pushfrom overwriting a good remote object with a protected local
object whose bytes no longer match its hash. - Make
import --moveconsume the source only after a verified cache object has
been published, including cross-filesystem moves. - Make
git-sfs mvrewrite 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-fromtransfers 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
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.3Highlights
- Ship the Rust implementation as the stable
git-sfsrelease 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
pushand
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 updateto update bothgit-sfsandrclonewith checksum
verification and atomic binary replacement. - Add
--preto the installer andgit-sfs self updateto opt into eligible
prerelease versions while keeping stable releases as the default. - Add
git-sfs llms-txtfor an offline, bundled reference document. - Add
git-sfs doctorchecks for repository, config, cache, version, rclone,
and remote preconditions. - Add
git-sfs statusandgit-sfs remotesJSON output for automation. - Add
git-sfs verify --rehashand--rehash-samplefor 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/.cachelocation when no.git-sfs/cachesymlink exists. - Make
add,import,mv,pull, and byte-moving operations cancellable;
interrupted writes leave no final partial cache object. - Stage
pushuploads under a remote temp prefix and publish final remote
objects only after the batch transfer and size verification pass. - Stage
pulldownloads in cache-owned temp storage, verify SHA-256, then adopt
objects into the cache. - Show rclone's own transfer progress for
pushandpull, 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, andverifyscoped 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_versionfloors 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
pushfrom overwriting a good remote object with a protected local
object whose bytes no longer match its hash. - Make
import --moveconsume the source only after a verified cache object has
been published, including cross-filesystem moves. - Make
git-sfs mvrewrite 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-fromtransfers 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
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.2Highlights
- Ship the Rust implementation as the stable
git-sfsrelease 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
pushand
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 updateto update bothgit-sfsandrclonewith checksum
verification and atomic binary replacement. - Add
--preto the installer andgit-sfs self updateto opt into eligible
prerelease versions while keeping stable releases as the default. - Add
git-sfs llms-txtfor an offline, bundled reference document. - Add
git-sfs doctorchecks for repository, config, cache, version, rclone,
and remote preconditions. - Add
git-sfs statusandgit-sfs remotesJSON output for automation. - Add
git-sfs verify --rehashand--rehash-samplefor 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/.cachelocation when no.git-sfs/cachesymlink exists. - Make
add,import,mv,pull, and byte-moving operations cancellable;
interrupted writes leave no final partial cache object. - Stage
pushuploads under a remote temp prefix and publish final remote
objects only after the batch transfer and size verification pass. - Stage
pulldownloads in cache-owned temp storage, verify SHA-256, then adopt
objects into the cache. - Show rclone's own transfer progress for
pushandpull, 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, andverifyscoped 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_versionfloors 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
pushfrom overwriting a good remote object with a protected local
object whose bytes no longer match its hash. - Make
import --moveconsume the source only after a verified cache object has
been published, including cross-filesystem moves. - Make
git-sfs mvrewrite 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-fromtransfers 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
Install
curl -fsSL https://github.com/Red-Eyed/git-sfs/releases/download/v1.22.0/install.sh | shAdded
git-sfs push [path]—pushnow takes an optional path argument, matchingpullandstatus. Only symlinks below that path are uploaded. Previouslypushalways 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 exits0, 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 fullgit-sfs pushsucceeds.
Fixed
missing cached filenow 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 thegit-sfs pullcommand that restores it.
v1.21.0
Install
curl -fsSL https://github.com/Red-Eyed/git-sfs/releases/download/v1.21.0/install.sh | shAdded
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.txtat repo root — LLM-friendly reference for agents browsing the GitHub repo before installing git-sfs. Generated byscripts/gen_llms_txt.pyfrom the existing docs; regenerate withjust gen-llms-txtwhen 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 runsgit-sfs llms-txtfor the full embedded reference.