RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 797025
Accepted
Ярослав Ильяшенко
Ярослав Ильяшенко
Asked:2020-03-12 19:38:28 +0000 UTC2020-03-12 19:38:28 +0000 UTC 2020-03-12 19:38:28 +0000 UTC

使用 Git 时使用内存

  • 772

我会尽量简短。在Git 的俄语文档站点上,给出了它如何工作的以下解释:

Git 将存储的数据视为小型文件系统的一组快照。每次您签入项目的当前版本时,Git 基本上都会保存项目所有文件在当前时间的样子的快照。为了效率,如果文件没有改变,Git 不会再次保存文件,而是链接到之前保存的文件。

Git 工作原理的可视化表示

所以,如果我们非常粗略地假设一个文本文件的大小趋向于 1Mb,那么按照 Git 的逻辑,即使是这个文件中最小的变化(单词中的错误已被纠正)都会创建一个“cast”(=copy ) 的文件,大小约为 1Mb。

问题:这对使用的内存有多大好处,或者文本文件是否以某种方式分成更小的文件,并且它们已经受到“强制转换”的创建?

git
  • 4 4 个回答
  • 10 Views

4 个回答

  • Voted
  1. Best Answer
    Pavel Mayorov
    2020-03-12T20:01:37Z2020-03-12T20:01:37Z

    简而言之:上图是对观察到的 GIT 行为的解释。如果您使用标准命令使用 GIT 并且不进入二进制文件,那么一切看起来都像这样工作。但这并不意味着文件的每个版本都会真正花费一兆字节......

    因为在较低级别,git 仍然使用文件之间的增量。你可以在这里阅读它们:Inside Git - Pack files

    但是,文件并不总是被打包,只有在达到解压对象数量的某个阈值或提交被推送到远程存储库时才会打包。如果您有大文件,在某些情况下,您必须显式执行一个命令git gc来重新打包所有 blob(例如,我们曾经必须将此命令添加到构建脚本中,因为在构建服务器上,发送到远程存储库永远不会发生,并且本地存储库不受控制地增长)。

    • 10
  2. user181100
    2020-03-12T20:00:41Z2020-03-12T20:00:41Z

    这正是“Git Inside - Pack Files”所讲述的内容。其实这个问题是有答案的:

    但是,Git 有时会将这些对象中的几个打包到一个单独的包文件中(pack 从英文翻译为 pack,compact),以节省磁盘空间并提高效率。当有太多“松散”对象时,以及git gc手动调用时,以及将更改发送到远程服务器时,都会发生这种情况。

    也就是说,在存储库运行一段时间后,文件的不同版本将最终在一个 Pack 文件中,它以一种更有效的方式表示不同的版本:通过基础和增量(差异,更改)。

    • 7
  3. Arhadthedev
    2020-03-12T20:13:34Z2020-03-12T20:13:34Z

    或者文本文件是否以某种方式分成较小的文件,并且它们是否已经受到“演员表”的创建?

    不,文件(与任何其他对象一样,例如,文件夹 - “子对象的名称 - 它的哈希”对的列表)被完整保存。顺便说一句,这增加了存储库的“生存能力”——如果由于某种原因某些对象被损坏或删除,那么恢复的可能性仍然非常高,如果不是最后一次提交,那么至少有一个最后一次提交.

    但是,与对象存储 ( ./git/objects) 并行的还有一个压缩文件,其中所有对象.git/objects/pack/以差异的形式存储在一个打包文件 ( ) 中。任何对象都可以放在那里,而对象的原始文件被删除。

    由于打包操作非常耗时,因此只有在调用命令时才会执行git gc --force。同时,存储库中的任何进一步更改(添加提交和重写历史记录)将继续将对象添加到主存储库;在第二种情况下,tails 也将保留在包文件中,只有在下次调用git gc.

    • 4
  4. A K
    2020-03-12T19:55:25Z2020-03-12T19:55:25Z

    TL;DR git 中的文件完全存储,不分割。这是相当有利可图的。

    有一些关于 git 的好文章(例如,示例)揭示了 git 的内部结构。

    用户在 data/letter.txt 上运行 git add。发生了两件事。

    首先,在 .git/objects/ 目录中创建一个新的 blob 文件。它包含 data/letter.txt 的压缩内容。它的名称是根据内容生成的哈希。例如,Git 对 a 进行哈希处理,得到 2e65efe2a145dda7ee51d1741299f848e5bf752e。哈希的前两个字符用于命名对象数据库中的目录:.git/objects/2e/。哈希的其余部分是包含添加文件内部的 blob 文件的名称:.git/objects/2e/65efe2a145dda7ee51d1741299f848e5bf752e。

    请注意,简单地将文件添加到 Git 会导致其内容存储在 objects 目录中。如果用户从工作副本中删除 data/letter.txt,它将被存储在那里。

    下面显示了文件更改时发生的机制。

    当用户创建 data/number.txt 时,他想写 1,而不是 1234。他进行了更改并将文件再次添加到索引中。此命令创建一个包含新内容的新 blob。

    您可以查看对象文件夹中的文件并使用 git cat-file -p 命令查看文件的解压缩表示。

    这是单个文件级别的机制。这似乎 - 次优消费。然而,还有一个额外的机制——当对象被打包成更大的文件时。

    存储大文件的问题也导致了LFS的引入。事实是,你甚至从未编辑过的大文件(图片类型的二进制文件)真的很难保存在 git 中,因此它们被保存到单独的文件存储中。

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5