返回 2026-05-01
💡 观点 / 杂谈

如果我能自己打造 GitHubIf I Could Make My Own GitHub

matduggan.com·2026-04-30

作者与朋友设想了一个假设场景:如果他们拥有无限资源,会如何构建自己的代码托管平台。他们考虑的核心理念是打造一个真正属于开发者、尊重代码所有权、避免平台垄断的理想化版本,强调去中心化与社区自治。

Mathew Duggan

我和朋友有个游戏,我们会聊如果变得超级有钱会做什么。不是那种“还清房贷”的有钱,是那种拥有潜艇却从未坐进去过的有钱,是那种第三任妻子开了护肤品牌的有钱,是科技巨头级别的有钱——能让你在怀俄明州买下一整片地产,还能让你穿着同一件灰色T恤去国会作证时充满自信的那种有钱。

我一直以来的梦想之一就是打造一个新的代码托管平台(forge)。这次动笔是因为看到一篇关于Ghostty在GitHub上表现不错的文章,但其实这个想法我已经酝酿和谈论好几年了。鉴于GitHub在其核心职能上已经变得如此糟糕,我觉得尝试描绘一下我这个亿万富翁式的理想化平台会很有意思。而且这个平台不会有太多阴茎形状的火箭,里面塞满过气的名人。

现代代码托管平台存在哪些问题?

GitHub、GitLab 和 Gitea(我主要用过的三个)本质上都是基于相似的设计理念。它们之间确实有差异,但可以看出GitHub为整个行业设定了标准,其他平台则试图借鉴这些特性,成功程度不一。问题在于,所有这些平台都试图添加git本身不具备的功能,而这些功能却是用户所需要的。

Git在其设计目标上表现出色,但它被设计用来解决的不是大多数人的使用场景。Git是内核开发者的完美工具。它是一个去中心化的分布式版本控制系统,其核心思想是通过邮件发送补丁给维护者。你信任这些维护者来管理他们负责的部分,只合并合理的提交,拒绝不合理的。这是一个高度信任的环境,对在线贡献者的地理位置或所用系统几乎没有限制。即使你有一台2010年的笔记本电脑,每周才连一次网,依然可以通过这些流程成为一个项目中有意义的贡献者。

然而,在大多数工作中,git实际上只是我从中央仓库拉取和推送代码的方式。所有重要的事情都在托管平台内部发生,而我的本地客户端上几乎什么都不做。Pull Request 是我用来执行“四眼原则”的方式,GitHub Actions 是我在 Pull Request 上运行测试和代码检查的工具,以确保代码功能正常并符合组织要求,用户在平台上的身份信息是我验证其身份的依据。我通过 Issues 跟踪代码中的问题,并通过 Releases 发布供用户下载的版本。这个工作流程中并没有太多 git 的操作,大部分功能都是建立在 git 之上的。

因此,这就是我对现代代码托管平台的主要不满,也是我希望能解决的问题。

  • 事情发生的顺序不对。你知道那个 PR 吗?Commit 1:'Feature.' Commit 2:'fix.' Commit 3:'fix.' Commit 4:'actually fix.' Commit 5:'please.' Commit 6,周四晚上11:47提交的:'asdfasdf'。这个人家里有妻儿,有自己的爱好。此刻,他正在哭泣。我们不想在提交之后再收到反馈,我们希望在提交之前就得到反馈。让我来实现一个强制性的 pre-commit hook,让它在远程的平台上运行任务,并在用户推送之前将反馈结果返回给他们。
  • PR审批太非黑即白了。PR要么被批准,要么没被批准。真实的代码审查,就像真实生活一样,存在于中间地带。“行吧,先放着以后再说”也是一种合理的人类回应,理应成为一个合法的选项。Gerrit在这方面做得更好。如果我是维护者,只是弱批准某项内容,我希望能够标记为“稍后处理”。
  • PR机制过于僵化。我不需要每处改动都经过四人审核,尤其是在存在LLM的时代。每年全球GDP因高级工程师盯着一个四行代码的PR,等待任何人敲出“LGTM”而白白流失的资金,足以资助一次配备座椅的月球任务。让我能自定义并更轻松地控制这一流程。如果提交者是维护者,且LLM判断风险极低或为零,就让他们直接通过吧。
  • 堆叠式PR(stacked PRs)显然更优。它们更容易审查和理解。必须将其作为一等公民对待,而不是通过非VCS工具附加的功能。
  • 平台不应包揽一切。问题追踪可以,看板板可能不行。Wiki?我表示怀疑。工具一旦功能泛滥,最终都会变得糟糕透顶。只在易于添加功能时才增加新功能,然后永远承担其维护成本——因为总有人会用上这些功能,你就被锁定了。
  • 托管的基本单位过大。运行GitHub Enterprise是大工程,运行GitLab也是不小的负担。这些都是复杂产品,包含大量组件。我希望有更小的独立托管单元,可以组合起来构成一个组织。即使它们无法全局联邦,我也愿意为每个组织单独创建账户;但组织应足够灵活,允许我说“这12台树莓派就是我的组织”。至于它们如何安全通信,那是另一个问题,我会雇人解决。
  • 本地仓库副本应是整个仓库的完整映射,而不仅仅是代码。我应该能通过我用来提交代码的同一个VCS来批准PR。我还应该能通过浏览本地文件来查看我的issue。
  • 另一方面,既然我需要时刻在线才能高效协作,就别让我一直为存储付费。我希望我的VCS和平台(forge)协同工作。克隆仓库时,我希望它只拉取有限的历史记录;当我试图回溯时,再启动一个worker从VCS按需获取所需内容。我不该被迫发起巨大的克隆请求来假设自己可能随时需要重建整个项目的完整历史——这会压垮平台。
  • Actions必须经过签名、SHA校验,并支持离线使用。如果我想,应该能将所有Actions打包成tarball放入仓库,并告诉系统:“checkout action不用去别处,就在这里”。如果我指定latest,就让它像Dependabot现在那样,自动打开PR将最新的tarball更新到我的仓库中。Actions至关重要,若我想,应能在本地机器上通过同一VCS运行它们。
  • 那么Y确实部分实现了这些想法

    没错。有很多工具各自实现了其中一部分。我希望有人能把它们整合起来,组装成一个完整的解决方案。我希望JJ作为VCS,这个平台作为Forge,并让用户相信:我可以长期愉快地用一台树莓派作为Forge。这些平台的设计应基于现代理念,比如对象存储、浅层克隆,以及持续被LLM机器人频繁调用。

    在一个 GitHub 做得足够好的世界里,我根本不会费心写这些。GitHub 是默认选择,跟人讨论如何绕过默认选项通常是浪费时间。就像点可乐时默认要 Heinz 番茄酱,我不会想要 Pepsi,如果我要用 Forge 到 2026 年,除非有极其充分的理由,否则我不会选别人用的那个。直到最近,其他 Forge 还像红薯薯条一样——也就是从来不是你想吃的那道。

    但我们现在所处的时代,那个大一统的 Forge 正在崩塌,而没人能造出替代品。有钱的人忙着造火箭,有品味的人忙着上班,剩下我们这些人则在午夜打开标题为 'asdfasdf' 的 PR,等着机器人审核,心里琢磨着:我们整个职业生涯都在用的工具,到底从什么时候开始就不是为我们打造的了?

    哪天我拿到潜艇经费了,一定告诉你。

    需要完整排版与评论请前往来源站点阅读。