git fork 200M 的仓库,服务端磁盘占用并不会变大,是怎么做到的

2024-02-29 18:28:24 +08:00
 weishao666

git fork 一个 200M 的仓库 A ,得到 B ,我在 B 的裸库查看大小 du -sh ,可以看到是 200M ,但是我整个磁盘的大小并不会增加 200M ,机会没变化。这是 git 的什么机制做到的呢?假如我把 B copy 到/tmp/B ,那磁盘就增加了 200M ,又是什么原理?肯定跟底层的文件引用啥的有关系,但是我在 B 的裸库中并没有见到软链接

3244 次点击
所在节点    git
47 条回复
e3c78a97e0f8
2024-03-04 07:36:39 +08:00
本地的 git clone 就是硬链接
atuocn
2024-03-04 10:17:04 +08:00
@ysc3839 github 如何实现内部存储的是个黑匣子,既然它说了 fork 是个 copy, 用起来也像个 copy (你提到的 commit 查询,只是 github 页面上的功能,本地应该是查不到的),那对我们来说就是一个 copy.

另外,我登入到 gitlab 的 server 上看了一下,它的 git 仓库就是一个一个的目录.
atuocn
2024-03-04 10:37:20 +08:00
好吧,33 楼给了答案。gitlab 使用了 git alternates 机制

At the Git level, we achieve deduplication by using Git alternates. Git alternates is a mechanism that lets a repository borrow objects from another repository on the same machine.
Shatyuka
2024-03-04 12:39:51 +08:00
Shatyuka
2024-03-04 12:41:11 +08:00
proxychains
2024-03-04 13:19:06 +08:00
@Shatyuka #45 哈哈哈哈哈哈哈哈哈
mxT52CRuqR6o5
2024-08-22 17:22:03 +08:00
压根就没人说过 fork 是个 copy, 实际用起来也不像 copy
依赖文件系统的 link 能力去管理重复文件非常地工程实践层面的不合理,如果文件系统不支持 link 那我 git 服务岂不是还部署不上去了?如果不同文件系统的 link 行为不一致,那我写实际业务代码时还得去考虑这些区别?压根儿就不应该往文件系统 link 这个方向去思考,在 git 自身已经提供了复用相同文件的机制的情况下,任何不借助 git 自身能力去管理重复文件的实践都是不合理的,完全属于画蛇添足脱裤子放屁的行为

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1019568

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX