代码之家  ›  专栏  ›  技术社区  ›  Tim unnamed eng

提交是否实现为文件?

git
  •  0
  • Tim unnamed eng  · 技术社区  · 6 年前

    在关系数据库系统中,表通常被实现为文件,或者数据库很少被实现为文件。

    2 回复  |  直到 6 年前
        1
  •  3
  •   VonC    6 年前

    Git存储库是文件的集合,“对象”是packfiles(压缩的)或loose(未压缩的文件)。
    见“ Git repository layout

    如中所述 Git Basics :

    在Git中到处都可以看到这些散列值,因为它经常使用它们。事实上, .

    Git目录是Git存储项目元数据和对象数据库的位置。这是Git中最重要的部分,当您从另一台计算机克隆存储库时,它是复制的。

    工作树是项目的一个版本的单个签出。这些文件将从Git目录中的压缩数据库中取出,并放在磁盘上供您使用或修改。

    注:非常 第一 为Git本身提交( commit e83c516

    有两种对象抽象:“对象数据库”和 “当前目录缓存”。

    对象的。
    所有对象都是根据其内容命名的,其内容近似于对象本身的SHA1散列。

    内容可寻址集合中有几种对象 数据库。它们都是用zlib放气的,从一个标签开始
    SHA1哈希始终是 对象,而不是原始对象。

        2
  •  2
  •   torek    6 年前

    这实际上是一个合理的高层观点。但是,当使用这种方法时,Git 键值存储(以及一些可选的附加存储,我们将在这里忽略它们)。一个取名字Git称之为 参考文献 ,它具有特殊的形式,如分支和标记名称,并将它们转换为哈希ID值。另一个数据库接受散列ID键并将它们转换为对象。

    commit实际上是“commit”类型的对象。每次提交都引用一个“tree”类型的(单个)对象,该对象表示保存的快照。树依次引用其他子树和/或“blob”对象,这些对象表示文件内容,或者对于符号链接,是链接的目标。

    在Git中,实现为一个文件:blob、树、提交。。。

    VonC said ,这些都只是 物体 松散的物体 ,在这种情况下,它位于 .git/objects/ 目录,或者它存储为 . 包裹 文件夹 存储在 .git/objects/pack/

    (pack文件的格式很复杂,有几个版本。)

    松散对象的文件名是它的hash ID键,用十六进制表示,前两个字母与剩余的38分开,用 / 分隔符,以便给定哈希ID 1234567... .git/objects/12/34567... .

    在相对罕见的情况下,可以将同一对象存储为松散对象

    (如果任何一个副本损坏,您可以尝试所有其他副本,但通常情况下,更容易转到单独的克隆。Git还将验证每个克隆操作的哈希完整性。Git并没有附带各种修复工具来尝试定位辅助副本,但它确实有工具来分解各个包文件,因此您可以手动执行此操作。)