Git仓库膨胀到2GB时,程序员们还在用1995年的设计哲学解决2024年的问题。一位叫Vashu Karn的开发者花了业余时间,用TypeScript写了一个叫drift的分布式版本控制系统——不是玩具,是真正能跑的生产级实现。
核心数据:完全兼容Git的对象模型,却在5个关键交互点上走了完全不同的路。
这5个差异点很有意思:撤销逻辑、冲突解决、合并体验、暂存区寻址、错误提示。每一个都是Git用户骂了十年但没改的地方。
底层架构:Git的骨架,TypeScript的血肉
drift的存储层和Git几乎一模一样。`.drift/objects`目录下,blob、tree、commit三种对象按`${type} ${length}\0${body}`的格式序列化,SHA-256哈希后zlib压缩,存成`objects/<前2位hex>/<剩余hex>`的路径。
这个设计Git用户太熟悉了。哈希前两位做目录分片,单文件夹最多256个条目,避免文件系统爆炸。
但Karn的选择在这里停住了——他没碰存储层,把创新全压在了上层交互。用他自己的话说:「Git的数据模型是对的,错的是人机接口。」
这有点像电动车早期的思路:电池和电机可以沿用成熟方案,但车机交互必须推倒重来。
差异点拆解:5个被Git「冻结」的设计
第一个改动是撤销(undo)。Git的reflog存在但难用,大多数人直到数据丢失才知道有这个功能。drift把撤销做成了显式命令,状态变更自动记录,支持多步回退。
第二个是冲突解决。Git的冲突标记把决策压力全扔给用户,drift引入了结构化的冲突表示,支持三方合并的可视化导航。
第三个最微妙:合并UX。Git的合并提交是历史里的「噪音节点」,drift允许更灵活的历史重写策略,在保留可追溯性和可读性之间做了新平衡。
第四个是暂存区(stash)的寻址方式。Git用引用(ref)指向stash,drift改用内容寻址——stash内容本身决定存储位置,消除了「stash冲突」这类玄学问题。
第五个是错误报告。Git的错误信息以技术细节为主,drift会推断用户意图,给出「你想做的是X,但Y阻止了它,试试Z」的引导式提示。
这5个改动有个共同点:都不触及存储层,全是交互层的手术。
TypeScript的取舍:为什么选这门语言
用TypeScript写系统工具是个反直觉选择。V8的启动开销、单线程事件循环、缺乏底层文件操作API——每一条都是性能雷区。
Karn的解释很直接:「我每天都在写TypeScript,用它实现想法最快。」
这不是敷衍。版本控制系统的性能瓶颈 rarely 在CPU,而在I/O和算法。drift用Worker线程处理哈希计算,用流式读写控制内存占用,实测在万级文件仓库上的表现「足够好」。
更重要的是生态。TypeScript的测试工具、类型系统、npm包管理,让一个人就能维护整个代码库。源码里看不到C语言项目常见的条件编译和平台适配层。
一个被忽略的信号
drift的README里藏着一句话:「This is a learning project, not a Git replacement.」
但Git的诞生故事我们都知道——Linus Torvalds同样说是「几周随便写的」,用来替代BitKeeper。历史不会简单重复,但押韵是常有的。
内容寻址存储、Merkle树、有向无环图——这些Git的核心抽象,正在被新一代开发者用更现代的语言重新实现。Jujutsu(Rust)、Sapling(Meta内部用)、Pijul(Rust)……drift是这条长队里的TypeScript选手。
它们的共同假设是:Git的数据层是标准,但接口层不是。就像TCP/IP协议栈稳定了,不代表浏览器必须用1990年代的界面。
Karn在GitHub的提交记录显示,这个项目从第一行代码到功能完备用了约8个月,纯业余时间。最后一个有意义的提交停在3周前——他在issue里回复用户:「正在考虑要不要加rebase -i的支持,但担心破坏简洁性。」
如果你现在去clone drift的仓库,会发现它的测试覆盖率比大多数生产项目都高。类型定义文件里甚至有详细的边界情况注释——这是一个人项目,但代码规范得像有CR(Code Review)流程。
Git今年19岁了。它的设计决策大多锁定在2005年,当时Linux内核的协作模式就是全世界最复杂的场景。但现在,AI辅助编程、实时协作、云原生开发——这些新场景正在暴露旧工具的接缝。
drift不会取代Git。但它提出的5个问题,每个都值得Git核心团队重新考虑:如果今天从头设计,暂存区还会叫index吗?冲突标记还是最佳方案吗?「历史不可篡改」是原则还是惯性?
最后一个细节:drift的logo是个漂移中的赛车轮胎印。Karn在讨论区解释过这个双关——drift既是「漂移」,也是「渐进偏离」。一个系统用久了,总会慢慢滑向当初没预料的方向。
Git的偏离用了19年。drift能偏离多远?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.