写点什么

微软工程师介绍了 Git 中一个会导致代码库膨胀的缺陷,修复方案即将推出

  • 2024-11-12
    北京
  • 本文字数:897 字

    阅读完需:约 3 分钟

大小:406.20K时长:02:18
微软工程师介绍了Git中一个会导致代码库膨胀的缺陷,修复方案即将推出

文最初发布于 DEV CLASS。



Git 计算同一文件不同版本差异的方法存在缺陷,可能会使代码库膨胀数倍,导致性能问题并消耗过多的存储空间。


微软高级工程师 Jonathan Creamer 发文 介绍了其团队使用的一个非常大的 JavaScript Git 存储库,一个单体库(一个存储库,存储多个相关的项目)。该库的每月活跃用户数超过 1000 人,代码行数约为 2000 万行。根据 Creamer 的报告,克隆这个存储库消耗了超乎想象的 178GB 磁盘空间。


该团队咨询了 Git 贡献者 Derrick Stolee(曾在 GitHub 工作,现为微软首席软件工程师)。他发现,在比较两个文件名是常用名的文件(本例中为 CHANGELOG.md)时,Git 实际上是在比较来自不同软件包的文件,因此每次提交都会发现很大的差异。


Stolee 向 Git 提交了一个 Pull 请求,添加了他所谓的 “path walk API”,使 Git 能够按路径对对象进行分组,“完全避免了文件名的哈希碰撞”。Creamer 使用新增的-path-walk参数,将git repack命令应用于这个大型存储库,结果库的大小减小到了 5GB。


在 Linux 内核邮件列表上,Stolee 也 发了 关于这个问题的帖子,称 “其主要发现是当前的文件名哈希算法只考虑了路径名的最后 16 个字符,在这样一个范围内自然会发生一些碰撞”。


在另一篇文章中,Stolee 指出:“在我查看的存储库中,按磁盘大小排序的前 100 个文件路径有一个明显的模式:其中 99 个是 CHANGELOG.json 和 CHANGELOG.md 文件...... 本应是一组微不足道的增量,却膨胀到了 20-60MB” 。


Stolee 还举了其他一些存储库的例子,用于说明新选项大大减少了它们所需的存储空间,其中一个存储库占用的存储空间从 130049MB 减少到了 4432MB。


Git 存储库过大的后果不仅是占用过大的磁盘空间,而且还会导致 Git 运行缓慢,有时甚至会完全失败,这取决于延迟和可用带宽。


虽然新选项确实可以显著节省空间,但这些例子都是大型存储库,有很多潜在的文件名冲突。典型的 Git 存储库无法以同样的方式受益。尽管如此,开发者们还是很希望在 Git 的发行版本中看到这些新功能。


原文链接:

https://devclass.com/2024/10/29/microsoft-engineer-describes-a-flaw-in-git-that-can-hugely-bloat-repositories-fix-is-on-the-way/

2024-11-12 18:237000

评论

发布
暂无评论
发现更多内容

各厂商的数据湖解决方案

五分钟学大数据

数据湖 7月月更

知其然,而知其所以然,JS 对象创建与继承

掘金安东尼

JavaScript 前端 设计模式 7月月更

关于目前流行的 Redis 可视化管理工具的详细评测

宁在春

redis 7月月更 Redis 可视化工具

还在为处理事务烦恼吗,要不试试Spring是如何处理业务的

Java学术趴

7月月更

通过Dao投票STI的销毁,SeekTiger真正做到由社区驱动

鳄鱼视界

【LeetCode】滑动窗口的平均值Java题解

Albert

LeetCode 7月月更

SAP Fiori 的附件处理(Attachment handling)

汪子熙

SAP Fiori SAP UI5 ui5 7月月更

队列的链式表示和实现

工程师日月

算法 7月月更

函数初认识-上

芒果酱

C语言 7月月更

开发第一个Flink应用

程序员欣宸

Java flink 7月月更

云原生(五) | Docker篇之深入Dockerfile

Lansonli

云原生 7月月更

C# SerialPort配置和属性了解

IC00

C# 7月月更

初学者如何快速的上手Linux命令,这34条新手必会的命令一定得会!

wljslmz

Linux 7月月更

SDL图像显示

柒号华仔

7月月更

Android热更新调研汇总

沃德

android 程序员 7月月更

mysql进阶(六)模糊查询的四种常见用法介绍

No Silver Bullet

MySQL 7月月更 模糊查询

查找——平衡二叉树

乔乔

7月月更

分库分表

ES_her0

7月月更

jQuery 的节点操作

Jason199

jquery js 7月月更

【愚公系列】2022年7月 Go教学课程 012-强制类型转换

愚公搬代码

7月月更

nacos服务注册之SpringCloud 集成nacos

急需上岸的小谢

7月月更

如何使用SVG制作沿任意路径排布的文字效果

南极一块修炼千年的大冰块

7月月更

【萌新解题】三数之和

面试官问

面试 LeetCode

Android ANR和OOM

沃德

android 程序员 7月月更

Pyodide 中实现网络请求的 3 种方法

OpenHacker

Python pyodide

MFC|框架下自绘CEdit控件

中国好公民st

c++ 7月月更

Android实现无序树形结构图,类似思维导图和级联分层图(无序,随机位置)

芝麻粒儿

android 7月月更

LeetCode-108. 将有序数组转换为二叉搜索树(java)

bug菌

Leet Code 7月月更

java零基础入门-File类(实战篇)

喵手

Java 7月月更

架构实战营|模块7

KDA

#架构实战营

Block 的分类

NewBoy

ios 前端 移动端 iOS 知识体系 7月月更

微软工程师介绍了Git中一个会导致代码库膨胀的缺陷,修复方案即将推出_安全_Tim Anderson_InfoQ精选文章