mcpField
G
GitFerry

GitFerry

本地服务
github.com/mayank1307版本控制01 周前更新

关于 GitFerry

GitFerry 是用于离线仓库的 Git 变更打包工具和本地 MCP 服务,适合需要在无法同步的机器间传递改动的开发者。它将提交、暂存与未暂存更改及未跟踪文件打入可验证的包,并支持预览后应用。

主要功能

  1. 01打包提交及工作区更改
  2. 02包含未跟踪文件并保留暂存状态
  3. 03校验校验和、仓库和基准提交
  4. 04预览或试运行后应用变更包
  5. 05通过 QR 码传递变更包
  6. 06提供命令行和 stdio MCP 服务

适用场景

  1. 01在隔离网络的仓库间转移改动
  2. 02向客户现场交付工作进度
  3. 03离线传递待审查的代码变更
  4. 04用 QR 码在无传输介质时传包

MCP 相关

本地 MCP 服务通过 stdio 运行,提供 pack_changes、inspect_bundle 和 apply_bundle 工具;客户端可打包、验证和应用变更包。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"mayank1307-gitferry": {
"command": "npx",
"args": [
"-y",
"gitferry"
]
}
}
}
启动命令npx -y gitferry

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmgitferry0.4.2

工具

3

收录的工具列表 · 更新于 1 周前

参数类型必填说明
cwdstring是Git 仓库的绝对路径(或仓库内任意目录)
basestring否bundle 应用到的 Ref/sha(默认:与上游跟踪分支的 merge-base)
onlyenum否选择全部、未提交、已暂存、未暂存、已提交或 repo(已跟踪文件快照)。默认值为 all。包含标志可进一步缩小选择范围;repo 为排他选项。all | uncommitted | staged | unstaged | committed | repo
outputstring否输出包路径;默认在当前工作目录中使用 <repo>-<branch>-<sha>.gitferry
portableboolean否写入普通 ZIP,供 git + unzip 目标使用,而不使用体积更小的 Brotli 封装格式(默认 false)
includeStagedboolean否包含已暂存(索引)更改(默认 true)
includeCommitsboolean否包含尚未推送的提交(默认 true)
includeUnstagedboolean否包含未暂存的工作树更改(默认 true)
includeWorktreeboolean否包含已暂存和未暂存的更改;是 includeStaged/includeUnstaged 的主开关(默认 true)
includeUntrackedboolean否包含未跟踪文件(默认 true)

详细介绍

gitferry

v0.4.2 已发布。 npm 包 · v0.4.2 发布说明和下载 · MCP Registry

适用于隔离网络仓库的便携式 Git 更改包。 在一台机器上,将尚未推送的提交、暂存/未暂存的更改和未跟踪文件打包成一个可共享文件——将其带过网络隔离区(通过 USB、安全文件传输、电子邮件或用网络摄像头扫描二维码)——在另一台机器上验证并应用到同一仓库。无需共享远程服务,无需网络,也无需同步。

machine A (has your changes)          machine B (same repo, no sync)
┌─────────────────────────┐           ┌─────────────────────────┐
│ $ gitferry pack         │  ──────▶  │ $ gitferry apply        │
│   → repo-main-a1b2c3d   │  USB /    │   ✓ checksums verified  │
│     .gitferry           │  scp /    │   ✓ same repo confirmed │
│                         │  email    │   ✓ 2 commits replayed  │
│  commits + worktree     │           │   ✓ staged/unstaged     │
│  + untracked, checksummed│          │     state restored      │
└─────────────────────────┘           └─────────────────────────┘

请参阅 SCENARIOS.md,了解适用的所有场景——隔离网络环境、客户现场工作、WIP 交接、离线审查等。请参阅 INSTALL.md,了解如何在其他设备上离线安装。

快速安装 MCP(Claude Code):运行 claude mcp add --transport stdio gitferry -- npx --yes [email protected] gitferry-mcp,然后重启客户端,并确认出现 pack_changes、inspect_bundle 和 apply_bundle 工具。Codex、VS Code、JSON 配置和离线设置请参阅下文的 MCP 服务。

为什么不直接用 git format-patch / git bundle?

可以——gitferry 底层使用了它们。原生 Git 无法提供的功能包括:

  • 未跟踪文件也会一并传输(遵循 .gitignore)——git diff 永远无法看到这些文件
  • 保留暂存与未暂存状态——另一端的索引状态与原来一致
  • 在仓库受影响之前进行验证:校验每个文件的 sha256 和、检查同一仓库指纹(根提交)、检查基准提交、检查工作区是否干净
  • 两端各用一个命令,而不是执行一系列 format-patch/diff/am/apply 操作
  • 安全处理二进制文件(跟踪文件使用 --binary 补丁,未跟踪文件使用原始字节)
  • 纯 Git 后备方案:包是标准 Git 补丁的 zip 文件——使用 --portable 打包后,只装有 Git 和 unzip 的机器也能手动应用(每个包内都附有说明;默认的精简格式需要先用 Node 的单行命令解包)

安装

需要 Node.js 22 或更高版本和 Git 2.32 或更高版本。从 npm 安装已发布的 CLI 和 MCP 服务:

npm install -g [email protected]
gitferry --version

如果仅使用 MCP,可跳过全局安装,改用 MCP 服务中的固定版本 npx 配置。

安装与注册 MCP 是两个独立步骤。 安装 npm 包后,便可在终端使用 gitferry 和 gitferry-mcp。注册服务则是告诉 Codex、Claude Code 或其他 MCP 客户端如何启动它。使用 npx 时,客户端会在首次启动时下载固定版本的软件包,因此无需全局安装。阅读本 README 或仅安装软件包,并不会注册服务。

封闭环境(无 npm)

从公开的 v0.4.2 发布页面下载 gitferry.cjs、gitferry-mcp.cjs 和 SHA256SUMS。这些独立文件包含其 JavaScript 依赖项;将它们传输到装有 Node 和 Git 的离线机器上。校验和验证及设置说明,请参阅 INSTALL.md。

从源码检出构建相同的独立可执行文件:

npm run bundle                 # → dist/gitferry.cjs + dist/gitferry-mcp.cjs
node dist/gitferry.cjs pack    # runs without any install or node_modules

用法

在有更改的机器上
gitferry pack                          # asks what should travel (Enter = uncommitted); base = merge-base with upstream
gitferry pack --only staged            # skip the question: all | uncommitted | staged | unstaged | committed | repo
gitferry pack --only repo              # whole-repo snapshot: every tracked file as-is — seed/sync another machine
gitferry pack --base origin/main       # explicit base
gitferry pack -o changes.gitferry --no-untracked

交互式选择器只会在终端中出现;在脚本中(无 TTY),pack 会打包所有内容,除非使用 --only 或 --no-* 标志指定其他选项。选择项含义:all = 提交 + 已暂存 + 未暂存 + 未跟踪 · uncommitted = 除提交以外的所有内容 · staged = 仅索引中的编辑 · unstaged = 工作树中的编辑 + 未跟踪文件 · committed = 仅尚未推送的提交 · repo = 磁盘上所有跟踪文件的快照(无历史记录)——应用时会为裸目录填充内容,或同步现有检出;跳过相同文件,只有使用 --force 时才会修改有差异的文件。

在接收机器上
gitferry inspect changes.gitferry      # verify + preview, touches nothing
gitferry apply changes.gitferry --dry-run
gitferry apply changes.gitferry
完全没有传输通道?用 QR 码传过去

如果连 USB 都无法使用,屏幕本身就是通道:一台机器将数据包循环显示为一系列 QR 码,另一台用任意摄像头读取。

# machine A (sender)
gitferry show changes.gitferry             # QR loop right in the terminal
gitferry show changes.gitferry --browser   # bigger + denser, in a local browser page
gitferry show changes.gitferry --color     # experimental: 3x density, 3 chunks per image in R/G/B

# machine B (receiver) — point its webcam at A's screen
gitferry read                              # opens a local camera page, reassembles the bundle
gitferry apply changes.gitferry

每个 QR 画面都包含分块编号 / 总数以及传输 ID,因此接收端确切知道还需要哪些分块——它会实时显示缺失的编号,并在循环重复时持续收集(顺序无关紧要;漏掉的画面会再次出现)。只有在所有编号的分块都已收到且整个文件的 sha256 校验值匹配后,才会写入文件,因此完成后的 read 就证明没有遗漏或损坏任何内容。两个页面都运行在 127.0.0.1 上,两台机器之间不会也无需使用网络。

将发送端的摄像头对准接收端,循环显示就会变得智能。 read 页面会显示一个小型的进度 QR 码(载荷很小、纠错能力很强,因此容易扫描)。如果运行 show --browser 的机器也有摄像头对着接收端的屏幕,那么每轮循环结束后,发送端只会重新显示仍然缺失的分块,并将速度从首轮速率(默认为 4 fps)降到较慢的重试速率(默认为 1 fps,--retry-fps),让剩余的分块更容易被捕获——一旦接收端的代码显示已完成,就会自动停止。发送端没有摄像头?那就和之前一样,始终以全速循环显示。

吞吐量大致为 chunk × fps:默认设置在终端中约为 0.3 KB/s,在浏览器中约为 0.6 KB/s,使用 --color 时约为 1.8 KB/s——适合补丁大小的数据包,不适合成堆的兆字节文件(pack --no-untracked 有助于缩小数据包)。默认采用有意设计的粗颗粒、易扫描代码(150 bytes ≈ QR 版本 8,49×49 个模块):摄像头读取另一个屏幕时,遇到细小模块问题的速度远快于遇到画面数量过多的问题。如果摄像头和屏幕性能不错,可以提高 --chunk(最高 2900)。

应用

应用顺序:提交(git am -3,完整保留作者、日期和消息)→ 已暂存补丁(索引 + 工作树)→ 未暂存补丁(仅工作树)→ 未跟踪文件(除非指定 --force,否则不会覆盖现有文件)。

发生冲突时,你会看到标准的 git 冲突标记和清晰的说明(git am --continue / --abort,最后才使用 .rej 文件)——应用过程不是事务性的,因此继续之前请先查看错误和恢复说明。

标志
标志命令作用
--base <ref>pack数据包应用到的提交
--only <what>packall / uncommitted / staged / unstaged / committed / repo — 非交互式选择
--no-commits / --no-worktree / --no-untrackedpack缩减捕获的内容(可与 --only 组合)
--portablepack生成普通 ZIP 数据包(体积约大 30%),适用于只有 git + unzip 的目标环境
--dry-runapply验证并显示计划,不做任何更改
--forceapply覆盖同一仓库、干净工作树和覆盖保护限制
-C <dir>pack/apply在其他目录中运行
--chunk <bytes> / --fps <n>showQR 载荷大小(默认 150 ≈ 版本 8 代码;提高可加快速度,降低则更容易扫描)和首轮显示速度
--retry-fps <n>show看到接收端的进度 QR 码后,重新循环显示缺失分块时使用的较慢速率(默认 1)
--browser / --colorshow浏览器页面显示;通过 R/G/B 通道实现实验性的 3× 密度
--no-open / --port <n>show/read不自动打开本地页面 / 固定其端口
-o <file> / --forceread输出路径 / 覆盖现有文件

MCP 服务

GitFerry 在本地通过 stdio 运行。MCP 客户端会启动该进程,并与同一台计算机上的仓库交互。无需 GitFerry 帐户、API 密钥、托管服务或上传源代码。仅支持 URL 的 MCP 客户端需要单独的桥接程序,无法直接连接此本地服务。

使用适用于你客户端的 CLI 注册(分别需要 Codex CLI 或 Claude Code):

# Codex
codex mcp add gitferry -- npx --yes [email protected] gitferry-mcp
codex mcp get gitferry

# Claude Code
claude mcp add --transport stdio gitferry -- npx --yes [email protected] gitferry-mcp
claude mcp get gitferry

选择客户端的注册命令,重新连接或启动新会话,然后确认 pack_changes、inspect_bundle 和 apply_bundle 均可用。mcp get 可确认已保存的配置;在已连接的客户端中发现工具,则可确认服务正在运行。请参阅 Codex 设置 了解 TOML 替代方案,并参阅由 Agent 协助安装以委托设置。

对于接受 mcpServers JSON 的客户端,请使用此配置来运行已发布的 0.4.2 软件包。显式指定可执行文件很重要,因为此软件包同时提供 CLI 和 MCP 服务:

{
  "mcpServers": {
    "gitferry": {
      "command": "npx",
      "args": ["--yes", "[email protected]", "gitferry-mcp"]
    }
  }
}

对于源代码检出版本,请使用 npm ci && npm run bundle 构建,并使用:

{
  "mcpServers": {
    "gitferry": {
      "command": "node",
      "args": ["/absolute/path/to/gitferry/dist/gitferry-mcp.cjs"]
    }
  }
}

如果你全局安装了该软件包,服务命令为 gitferry-mcp。对于下载的离线软件包,请将 node 直接指向 /absolute/path/to/gitferry-mcp.cjs。请参阅客户端设置,了解 Codex、Claude Code 和 VS Code 示例及 Windows 启动说明。

工具操作关键参数
pack_changes根据本地更改写入可移植软件包cwd、可选的 output、base、only、portable 和包含标志
inspect_bundle读取并验证软件包,但不更改仓库bundlePath
apply_bundle预览或将软件包应用到本地目标cwd、bundlePath、dryRun、force、includeUntracked

请使用绝对路径。从这句提示开始:“将 /absolute/path/to/repo 中未提交的更改打包到 /absolute/path/to/transfer.gitferry。” 在接收机器上:“检查此软件包,然后对 /absolute/path/to/repo 执行试运行,并在应用前显示计划。”

only 接受 all、uncommitted、staged、unstaged、committed 或 repo。快照模式(repo)传递当前跟踪文件的内容,而非历史记录;它可用于初始化空目录。未指定选项时,默认包含所有更改类别,与非交互式 CLI 的行为一致。工具注解会向客户端描述副作用;它们不会强制要求批准,也不会限制文件系统访问。

请参阅 INSTALL.md 了解设置和离线传输,参阅 DEMO.md 了解两个仓库的演示流程,并参阅 PUBLISHING.md 了解维护者的发布步骤。已发布的注册表标识:io.github.mayank1307/gitferry。

由 Agent 协助安装

在可访问终端和配置的 Codex 或 Claude Code 中粘贴以下内容:

使用 https://github.com/mayank1307/gitferry/blob/main/INSTALL.md,在此客户端中将 GitFerry v0.4.2 设置为本地 stdio MCP 服务。检查 Node.js 22+ 和 Git 2.32+。检查是否已注册 GitFerry,保留其他服务,并为此客户端注册固定版本的 npx 命令。全局 npm 安装为可选项。验证已保存的配置,然后确认 pack_changes、inspect_bundle 和 apply_bundle 均可用。如果需要重启或新会话,请告知我该怎么做,并在之后验证工具发现情况。

在收到请求并获得所需访问权限后,Agent 可以执行设置。注册后,软件包会通过 npx 自动下载;客户端的批准和重新连接遵循客户端的常规行为。

Bundle 格式

.gitferry 文件是一个采用以下布局的 zip 文件——默认使用 brotli 封装(GFBR 魔数 + 存储型 zip 的 brotli 流,比 deflate zip 小约 30%;pack --portable 会写入普通 zip,而 inspect/apply 会自动检测两种格式):

manifest.json            # versioned manifest: repo fingerprint, base/head shas,
                         # content listing, sha256 of every entry
commits/00NN-*.patch     # git format-patch output (mbox — author, date, message)
worktree/staged.patch    # git diff --binary --cached
worktree/unstaged.patch  # git diff --binary
untracked/<paths>        # verbatim file bytes
README.txt               # human instructions for manual apply with plain git

其中的所有内容都经过设计,可由标准 Git 直接使用;gitferry 增加了完整性检查和一条命令即可完成的体验,但绝不使用专有编码。对于只有 git + unzip 的目标环境,请使用 --portable 打包;默认的紧凑格式仍可由任何安装了 node 的机器解包(单行命令见 Bundle 自带的 README.txt)。

说明与限制

  • 打包范围内的合并提交会被 format-patch 展平——打包时会发出警告;建议使用线性分支,或选择其他 --base
  • 重放后的提交会获得新的 sha(内容和作者相同,提交者不同)——这是 git am 的正常行为
  • 更改 Bundle 要求共享仓库历史(通过根提交指纹进行验证);快照 Bundle 也可以用于初始化空目录。
  • 应用机器需要 git ≥ 2.32

安全与信任

Bundle 中包含源代码、提交消息,以及可能存在的未跟踪机密信息。分享前请检查所选内容和目标位置。.gitignore 会排除被忽略的未跟踪文件,但不会移除已在 Git 中跟踪的机密信息。校验和可以检测损坏,但无法验证发送者的身份或可信度。仅应用来自可信来源的 Bundle。

服务拥有启动它的进程所具备的文件系统权限。仅在可信客户端中配置,并以普通用户身份运行。force 会绕过仓库、工作区脏状态和覆盖保护。关于强制实施的限制、符号链接行为和并发边界,请参阅 SECURITY.md。

开发

源代码布局请参阅仓库架构;本地、npm 和 Docker 配置请参阅 MCP 部署。可复制的客户端配置位于 examples/mcp。

npm ci
npm run build     # tsc → dist/
npm test          # vitest: round-trip e2e on real temp repos + guard tests
npm run bundle    # fresh single-file CLI + MCP server
npm run release:check  # versions, build, tests, and isolated package smoke test

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。