# 策展 · X (Twitter) 🔥🔥

> 作者：Thomas Dohmke (@ashtom) · 平台：X (Twitter) · 日期：2026-05-01

> 原始來源：https://x.com/ashtom/status/2049879381187915831

## 中文摘要

`EntireHQ 開源 git-sync，實現無本地 clone 的 Git 遠端鏡像同步。`

EntireHQ 最新開源專案「git-sync」，由 GitHub CEO Thomas Dohmke 推廣，解決大規模 Git 儲存庫從一個遠端鏡像到另一遠端的痛點，避免傳統工具需本地下載全量資料的瓶頸。該工具使用記憶體內 go-git 物件儲存，直接透過 Smart HTTP 串流 packfiles，支援人類與 Agent 貢獻。

**核心創新**

git-sync 不需建立本地 checkout，直接鏡像來源遠端 refs 到目標遠端：
- 透過 `info/refs` 廣告來源與目標 refs。
- 使用 `upload-pack` 從來源擷取，廣告目標 tip hashes 作為 `have`。
- 以 `receive-pack` 推送到目標，包含明確 ref 更新指令與串流 packfile。

此設計讓目標端維持增量更新，而無需先將目標物件拉入本地程序，傳統鏡像工具則需本地 mirror clone 後 mirror push，轉化為本地儲存問題。

**使用情境與限制**

git-sync 適用於大規模 repo，避免 shell 腳本包裝 `git fetch` / `git push` 的規劃缺失與非結構化輸出：
- 規劃每項動作後推送，並發出類型化 JSON 供自動化使用。
- 不適合雙向同步，為單向來源到目標；反向需交換端點重新執行。
- 僅支援 Smart HTTP/HTTPS，不支援 SSH；非守護程序，需透過 cron、CI 或 worker 定時執行。

詳細使用時機與不適用場景見 [docs/architecture.md](docs/architecture.md)。

**指令與行為**

主要指令簡潔高效：
- `git-sync sync`：鏡像來源 refs 到目標，自動啟動空目標的 bootstrap，並支援後續同步。
- `git-sync replicate`：透過 relay 覆寫目標 refs 匹配來源，失敗時不本地實體化。
- `git-sync plan`：預覽動作，同 sync 旗標，`--mode replicate` 預覽 replicate 執行。

`sync` 對空目標自動選 bootstrap relay 路徑；非空目標的安全 fast-forward 更新也用 relay 串流來源 pack 至目標 `receive-pack`，無本地實體化。非 relay 資格動作（如 force、prune、刪除、tag 重定向）回落到 `--materialized-max-objects` 限制的實體化路徑。

**傳輸模式與擴展性**

git-sync 提供兩種傳輸路徑，解決大 repo 記憶體與效能瓶頸：
- **Relay**：pack 資料從來源 `upload-pack` 直接串流至目標 `receive-pack`，本地程序不持物件圖，記憶體不受 repo 大小限制，僅當目標支援 relay 時使用。
- **Materialized fallback**：relay 不可用時，將所需物件拉入記憶體內 go-git 儲存，規劃後編碼推送 packfile；記憶體隨推送 diff 擴展，受物件數上限守護，bootstrap 可批次大初始同步。

規劃本身低成本：僅 refs 往返，加上來源支援 filter 時的 `filter tree:0` 擷取用於祖先檢查。中型 repo 時間依大小、網路與 relay 可用性而定，近似 `git clone` 來源加 `git push` 同 pack 時間；實體化增加本地物件檢查工作。基準測試工具見 [docs/testing.md](docs/testing.md#benchmarking)。

**完整性與功能支援**

git-sync 同步完整 Git 物件歷史，非淺層 clone：
- 規劃與更新 refs，同時傳輸 commits、trees、blobs、tags 確保目標 refs 有效。
- 支援建立、更新 refs；`--force` 強制更新；`--prune` 刪除管理 refs。
- 分支過濾、ref 映射、tags、pruning、協議選擇、JSON 輸出、認證詳見 [docs/usage.md](docs/usage.md)。

FAQ 強調：非僅 refs，也傳物件；非雙向；replicate 更嚴格僅 relay。

**程式庫 API 與安裝**

作為 Go 程式庫，穩定嵌入介面為 `entire.io/entire/git-sync`（`Probe`、`Plan`、`Sync`、`Replicate`、類型化結果、認證、HTTP 注入）；`entire.io/entire/git-sync/unstable` 暴露進階控制（`Bootstrap`、`Fetch`、批次旋鈕、heap 測量），不保證穩定。需 Go 1.26+。

安裝途徑：
- **Homebrew**（macOS、Linux）：`brew tap entireio/tap` 後 `brew install --cask git-sync`。
- **go install**：`go install entire.io/entire/git-sync/cmd/git-sync@latest`，置入 `$(go env GOPATH)/bin`。
- **源碼建置**：clone 後 `go build -o git-sync ./cmd/git-sync`。

快速啟動範例：
```
git-sync sync \
  --source-token "$GITSYNC_SOURCE_TOKEN" \
  --target-token "$GITSYNC_TARGET_TOKEN" \
  https://github.com/source-org/source-repo.git \
  https://github.com/target-org/target-repo.git
```

**文件與測試**

完整文件涵蓋：
- [docs/usage.md](docs/usage.md)：CLI 指令、範例、sync 行為、JSON 輸出、認證、協議。
- [docs/architecture.md](docs/architecture.md)：產品緣由、套件佈局、操作模式 vs 傳輸模式、記憶體模型。
- [docs/protocol.md](docs/protocol.md)：Smart HTTP、pkt-line、capability 協商、sideband、relay 框架。
- [docs/testing.md](docs/testing.md)：測試套件與整合涵蓋。

預設測試：`env GOCACHE=/tmp/go-build go test ./...`；擴展測試見文件。

**貢獻邀請**

歡迎人類與 Agent 貢獻，詳見 [CONTRIBUTING.md](CONTRIBUTING.md)、[SECURITY.md](SECURITY.md)、[CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)。git-sync 填補 Git 生態空白，特別適合 Agentic 程式開發與自動化場景，預計加速遠端 repo 遷移與鏡像需求。

## 標籤

開源專案, 自動化, 其他, EntireHQ, GitHub, Git
