用 Git 历史链替代数千个 Release 标签
Maybe a better way to track the release history of a Git repo
在 ZipRecruiter 工作期间,我们的 Git monorepo 因部署工具为每次发布创建大量标签而陷入性能泥潭。成千上万个 refs 导致 `git fetch` 和 `git branch` 等日常命令变慢,且标签列表杂乱无章。我提出了一种替代方案:不再为每次发布创建新标签,而是利用 Git 自身的历史机制,将每次发布记录为具有两个父节点的元信息提交(metainfo commit)。这样,每个应用只需一个 ref,通过链表结构即可完整追溯发布历史。这不仅解决了性能瓶颈,还让 `git log` 等原生命令能自然、高效地查询和回滚发布记录,真正实现了在不引入额外负担的前提下记录不可变的审计轨迹。
将部署历史存储在仓库中的一个好理由,是使其变得不可变,但标签本身并不是不可变的!