Repository navigation
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.