Git GUI 遥测对比:2026 年谁在追踪你
大多数桌面应用程序都会收集使用数据。Git GUI 也不例外。本文基于可观察的网络流量,比较了四个流行的 Git 客户端 — GitKraken、Fork、SourceTree 和 GitSquid — 的遥测行为。数据来自对每个应用程序进行的 24 小时数据包捕获会话,期间打开同一个仓库,并将用户交互降至最低。
声明:本文发布在 GitSquid 网站上。方法论已详细描述,以便你可以自己复现这些数据。
为什么这很重要
"遥测"是"你的应用程序在你没有主动请求的情况下向其供应商发送数据"的委婉说法。通常这些数据确实是无害的:匿名使用计数器、崩溃报告、特性标志检查。有时则更多:你点击了哪些按钮、你打开了哪些仓库、你尝试了哪些功能。
对大多数用户而言,这不是问题。但对三类用户来说,这是硬性约束:
- 受监管行业。医疗、金融、国防、政府。IT 审查流程通常会阻止任何向外发送可识别数据的工具。
- NDA / 专有工作。如果你的仓库名称或分支名称包含客户或产品信息,通过遥测泄露这些信息是真正的隐患。
- 注重隐私的开发者。有些人就是不希望自己的工作流遥测被收集,无论它声称多么匿名化。
方法论
对每个应用程序:
- 在没有先前历史的 Mac (M2、macOS 15) 上全新安装。
- 配置一个本地仓库 (GitSquid 源仓库,无远程的合成克隆)。
- 在应用程序中打开仓库,然后保持应用程序聚焦但闲置 24 小时。
- 使用 mitmproxy 在透明模式下捕获网络流量,证书在系统级别受信任。
- 按目标域名统计请求。排除自动更新检查 (单独统计)。
仓库未配置远程,因此 24 小时窗口期间的任何出站流量要么是遥测、要么是许可证验证、要么是自动更新检查。区分三者很简单:许可证验证一次只命中单个许可证服务器端点;自动更新器一次或两次命中已知的发布清单 URL;其他一切都是遥测。
结果
| 工具 | 遥测请求 / 24 小时 | 自动更新检查 | 许可证验证 | 出站总数 |
|---|---|---|---|---|
| GitSquid | 0 | 1 | 1 (仅 Pro) / 0 (Free) | 启动时 1-2,之后 0 |
| Fork | 0 | 2 (清单轮询) | 0 | 2 |
| SourceTree | ~80 | 2 | 1 (Atlassian 登录) | ~83 |
| GitKraken | ~140 | 2 | ~24 (每小时心跳) | ~166 |
四个应用程序中有两个基本上不发送任何内容。两个即使没有用户交互,每天也发送数十到数百个请求。
请求去往何处
GitKraken
24 小时窗口期间观察到的目标:
api.gitkraken.com— 许可证心跳、账户会话刷新和特性标志检查。analytics.gitkraken.com— 使用分析。每次导航、面板打开和 Git 操作都会生成事件。sentry.io— 错误报告 (也会在警告时触发,不仅仅是崩溃)。statsig.com— 特性标志和 A/B 测试评估。logrocket.com在某些会话中 — 启用时的会话回放。
SourceTree
id.atlassian.com— 账户会话刷新,定期调用。sourcetree.atlassian.com— 功能使用分析。sentry.io— 错误报告。analytics.atlassian.com— Atlassian 跨产品分析。
Fork
git-fork.com/sparkle— 自动更新清单。在 24 小时窗口内检查两次。未联系任何遥测端点。
GitSquid
github.com/TheMax98000/gitsquid-releases— 自动更新清单 (`latest.json`)。启动时获取一次。截至 v2.7,该检查是强制性的,用户不可禁用 (设置中的开关已列入路线图)。gitsquid.dev/api/validate-license— 许可证验证。启动时发送一次请求,仅针对 Pro 用户 (Free 用户不会命中此端点)。请求体仅包含作为查询参数的许可证密钥 — 没有机器 ID、没有使用数据、没有遥测。如果 API 不可达,应用会回退到最近的缓存结果,然后回退到对密钥的本地校验和验证。因此 Pro 许可证可以离线继续工作,但当网络可用时,默认路径是在线检查。- 任何时候均未联系遥测端点。无分析、无事件追踪、无崩溃报告服务、无特性标志服务。
数据是什么样的
请求数量是一回事。每个请求的内容是另一回事。我们抽样了几个 GitKraken 分析 POST:
- 仓库路径 (完整本地路径,经过哈希处理但如果你有盐则可逆)。
- 当前检出分支的名称。
- 仓库中的提交数量。
- 执行了哪些 Git 操作以及频率。
- 打开了哪些 UI 面板。
- 操作系统、应用程序版本、屏幕分辨率。
这些都不是恶意的,GitKraken 的隐私政策也披露了这一点。但对于 NDA 下的用户而言,"当前检出分支的名称"可能将 `feature/customer-acme-bug-fix` 泄露到第三方服务器,而这正是 NDA 通常禁止的。
SourceTree 的载荷较小且更匿名,但仍包括仓库指纹和功能使用事件。
能否关闭?
| 工具 | 是否可选择退出? |
|---|---|
| GitKraken | 部分 — 你可以禁用部分分析,但不是全部 (许可证心跳是强制性的)。 |
| SourceTree | 部分 — 存在分析退出选项,账户会话刷新是强制性的。 |
| Fork | 不适用 — 没有需要退出的遥测。可禁用自动更新。 |
| GitSquid | 不适用 — 没有需要退出的遥测。自动更新检查和许可证验证均在启动时发生一次,目前无法从设置中禁用。两者的开关已列入路线图。 |
对于 GitKraken 和 SourceTree,"关闭遥测"与"无出站流量"不是一回事。许可证 / 账户会话刷新会继续进行。
对于 IT 审查
许多企业 IT 部门会在批准桌面工具之前对其进行审查。他们会问的问题:
- 是否需要账户? — GitSquid 和 Fork 不需要。GitKraken 和 SourceTree 需要。
- 是否会回拨? — 对于 GitSquid:是,但仅在启动时 (1 次更新检查 + 针对 Pro 的 1 次许可证验证)。无分析、无周期性后台流量。对于 Fork:仅自动更新清单。对于 GitKraken 和 SourceTree:是,在整个会话期间持续发生。
- 许可证验证是否支持离线? — 对于 GitSquid:先尝试在线 (仅 Pro),回退到最近的缓存结果,如果两者都失败则回退到本地校验和。Pro 密钥在没有互联网的情况下可继续工作;当网络可用时,在线检查是默认方式。对于 Fork:一次性许可证,无需验证。对于 GitKraken:需要在线。
- 是否会泄露仓库 / 分支名称? — GitSquid 和 Fork 不会。GitKraken 会 (在分析载荷中),SourceTree 部分会。
对于气隙环境,GitSquid 的自动更新检查和许可证验证将简单地静默失败并回退到缓存 / 离线路径。应用程序继续正常工作,但 IT 可能希望了解启动时的这两个出站请求。未来在设置中加入跳过两者的开关将简化在严格环境中的部署。
对于严格受监管的环境,GitSquid 和 Fork 最容易通过审查 — 唯一的出站流量是有界的 (对 GitSquid 而言仅在启动时) 或仅用于更新 (Fork)。GitKraken 和 SourceTree 在没有协商数据处理协议的情况下通常无法通过。
复现这一过程
上述数据是使用 mitmproxy 在透明代理模式下测量的。要在自己的机器上复现:
- 安装 mitmproxy:在 Mac 上运行
brew install mitmproxy,在 Linux 上使用包管理器等效命令。 - 配置系统通过 `localhost:8080` 路由 HTTPS。
- 在系统级别信任 mitmproxy CA。
- 启动你的 Git 客户端,打开本地仓库,保持聚焦。
- 在 mitmproxy 的 UI 中观察实时请求日志。
你会看到遥测较多的客户端的请求计数实时增长,而其他客户端则保持平稳。
诚实的看法
遥测本身并非邪恶。软件供应商使用它来修复错误、确定功能优先级并了解他们的用户是谁。GitKraken 的隐私政策对收集内容是透明的,这些数据确实有助于他们打造更好的产品。
选择是你是否想要这种权衡。对于消费者工具 (浏览器、音乐播放器),大多数人都接受。对于在潜在敏感代码上运行的开发者工具,越来越多的开发者说不 — 尤其是当无遥测的替代品变得与被追踪者一样强大时。
如果"最少出站、无分析、无第三方追踪器"在你的需求列表中,请下载 GitSquid。启动时会发出 1-2 个请求 (更新检查 + 针对 Pro 的许可证验证),之后整个会话不再有任何请求。同样的限制大致适用于 Fork (一次性 59 美元,无 Linux 版本)。两者都能通过 GitKraken 和 SourceTree 通常无法通过的 IT 审查。