Document v0.4.2 in CHANGELOG · Entire
Document v0.4.2 in CHANGELOG
c586ffd→main·
gtrrz-victor·2mo ago·1 file·+98 added/-42
First public release entry covering sync/replicate/plan/bootstrap, the library API, protocol plumbing, packaging, and docs. Restructured to Keep a Changelog format to match the rest of the entire.io repos.
Sessions
6023756b6121View transcript
[?
Can you update CHANGELOG.md for a 0.1.1 with all the changes since repo was created. Keep the style of https://github.com/entireio/cli/blob/main/CHANGELOG.mdClaude Code·Opus 4.7[1m]·2 steps](/content/gh/entireio/git-sync/session/4aa65553-be37-439e-acb2-f89621d78b4e#timeline-6023756b6121/index.html)
Changes
1
- MCHANGELOG.md+98/-42
Changelog
Entries are grouped per release. Unreleased changes sit at the top. All notable changes to this project will be documented in this file.
Unreleased
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.4.2] - 2026-04-30
First public release. git-sync mirrors refs from a source remote to a target
remote without a local checkout, streaming source packs directly into target
receive-pack whenever possible. The release covers the CLI, the library API,
and the protocol plumbing they share.
Added
git-sync replicatesubcommand andgit-sync plan --mode replicateforgit-sync sync— relay-based mirror that streams sourceupload-packoutput into targetreceive-packwithout materializing the object graph locally. Falls back to an in-memorygo-gitstore, bounded by--materialized-max-objects, when relay is not eligible (force, prune, deletes, tag retargets) (#1, #2).git-sync replicateandgit-sync plan --mode replicatefor source-authoritative, relay-only replication. Divergent branches and tags are retargeted against the source;--prunedeletes orphan managed refs. Relay-only by design: no materialized fallback. Replicate works against targets that advertiseno-thin(including any server built on go-git's receive-pack, e.g.entire-server) because the relayed pack is always self-contained — our upload-pack client never requests thethin-packcapability from the source.gitsync.Client.Replicateon the stable embedding surface.gitsync.OperationMode,gitsync.ModeSync,gitsync.ModeReplicate, andSyncPolicy.Modefor selecting the mode from library callers.--max-pack-bytesand--target-max-pack-bytesflags onsync,replicate, andplan. Previously onlybootstrapexposed them, but replicate's bootstrap-fallback path internally honors both — without these flags, users couldn't split a huge initial replicate push into tractable receive-pack POSTs for size-limited targets. The unstable librarybuildSyncConfignow forwardsMaxPackBytesandTargetMaxPackBytesfromAdvancedOptionstosyncer.Config. Relay-only by design: no materialized fallback (#4).git-sync plan— preview the actions asyncorreplicatewould take, with structured JSON output suitable for automation.git-sync bootstrap— initial-seed path for empty targets, with adaptive batching, trunk-first planning to cut per-branch graph fetches, and resume-from-stale-temp-refs recovery (#6).git-sync versionsubcommand with build metadata (#26).- Reusable Go library at
entire.io/entire/git-sync. The stable surface (Probe,Plan,Sync,Replicate, typed results, auth and HTTP injection) lives at the module root; advanced controls (Bootstrap,Fetch, batching knobs, heap measurement) live inentire.io/entire/git-sync/unstable(#3, #17). - Git protocol v2 source-side support:
ls-refs,fetchwith v2 acknowledgments and response-end handling, capability negotiation, and graceful fallback when the source does not advertise v2. - Smart HTTP transport: pkt-line primitives, sideband demultiplexing, info/refs
advertisement validation, smart endpoint path normalization, oversized
packet rejection, empty pkt-line acceptance, and v2 fetch remote
ERRpacket handling. - Optional info/refs redirect following on the source endpoint, exposed
through the public
gitsyncAPI (#9). - Git credential helper fallback and
--source-token/--target-tokenflags for HTTPS auth. - JSON output mode with a stable schema and camelCase keys across all commands (#7).
- Adaptive bootstrap batching: auto-subdivide on target body-size rejection,
pre-check PACK header object count before pushing oversized batches, and
shared
--max-pack-bytes/--target-max-pack-bytesflags acrosssync,replicate,plan, andbootstrap. - Sideband progress streamed to stderr when
-vis set. - Homebrew tap install via
brew tap entireio/tap && brew install --cask git-sync(#25). - GoReleaser-based release pipeline for cross-platform binaries (#26).
- Documentation set:
docs/usage.md,docs/architecture.md,docs/protocol.md,docs/testing.md, plus README installation, quick-start, and FAQ (#21, #22, #23).
Changed (stable API, breaking)
Changed
- The stable
SyncResult.Executionsummary has a new field layout:- Added
execution.operation_mode("sync"or"replicate") to describe the high-level product mode the caller requested. - Renamed
execution.modetoexecution.transfer_modeto describe the low-level engine path that actually executed (incremental-relay,materialized,bootstrap-relay,replicate, etc.). The previousmodekey is no longer emitted.
- Added
External embedders that parse execution.mode must switch to
execution.transfer_mode. There is no compatibility alias; the field was
renamed in place.
syncer.Result(the CLI-level JSON shape) gains a top-leveloperation_modefield alongside the existing relay fields. Callers consuming the flat CLI JSON can use it to distinguish sync vs replicate results.- Module path consolidated to
entire.io/entire/git-sync, with the package moved to the repo root for ergonomic imports (#5, #12, #15, #17, #27). - Go 1.26.2 minimum (#16).
go-gitupgraded tov6.0.0-alpha.2, which also pulls in the fix for CVE-2026-41506 (#11).- Identical source and target endpoints are now rejected before any network round-trips.
Fixed
- Work around a go-git v6 upload-pack bug where the server emits two
- Worked around a
go-gitv6 upload-pack bug where the server emits two consecutiveNAKpktlines in stateless-RPC mode when the client sends haves that are not reachable from any want. The second NAK would otherwise be misread by the sideband demuxer as a frame with channel byte'N'("unknown channel NAK").internal/gitproto.fetchPackV1andfetchToStoreV1now drain trailing NAKs before handing off to the demuxer. See the corresponding go-git fix (plumbing/transport: don't emit a second NAK after encoding empty ACKs). haves that are not reachable from any want. The second NAK was otherwise misread by the sideband demuxer as an unknown-channel frame. - Hardened pkt-line parsing and error handling for malformed advertisements,
oversized packets, and v2 remote
ERRframes (#14). - Bootstrap resume now finds the chain position from stale temp refs instead of failing on resume mismatch, and clears them when no recoverable position exists.
- Skip pack push for branches fully subsumed by trunk to avoid redundant receive-pack POSTs.
Housekeeping
- GitHub Actions CI with
golangci-lint, license check, and pinned action SHAs for supply-chain hygiene (#7). - Integration-test harness against
git-http-backend, plus end-to-end coverage of plan, dry-run, prune scope, identical-endpoint rejection, and incremental push failure recovery (#18). - Removed Slack failure notification from the release workflow (#28).