gpt4 book ai didi

c# - Git 仓库内部格式解释

转载 作者:IT王子 更新时间:2023-10-29 00:39:28 26 4
gpt4 key购买 nike

是否有关于 Git 如何在其存储库中存储文件的文档?我尝试通过 Internet 进行搜索,但没有可用的结果。也许我使用了不正确的查询,或者这可能是个绝密的 secret ——Git 存储库内部格式?

让我解释一下,为什么我需要这些火箭科学信息:我正在使用 C# 从存储库中获取文件历史记录。但在 libgit2sharp 库中,目前还没有实现。所以(作为一个负责任的人;)我需要自己实现这个功能并为社区做出贡献。

但是在将内核源代码移动到 github 之后,我什至不知道从哪里开始搜索。

非常感谢!

最佳答案

存储库的内部格式非常简单。 Git 本质上是一个内容可寻址的用户空间文件系统。

这是一个缩略图。

对象

Git 将其内部数据结构存储为 objects .有四种对象:blob(有点像文件)、树(有点像目录)、提交(文件系统在特定时间点的快照以及有关如何到达那里的信息)和标签(指向提交的指针用于标记重要的)。

如果查看存储库的 .git 目录,您会发现一个 objects 目录,其中包含以 SHA-1 哈希命名的文件。它们每个代表一个对象。您可以使用管道 git cat-file 命令检查它们。来 self 的一个存储库的示例提交对象

noufal@sanitarium% git cat-file -p 7347addd901afc7d237a3e9c9512c9b0d05c6cf7
tree c45d8922787a3f801c0253b1644ef6933d79fd4a
parent 4ee56fbe52912d3b21b3577b4a82849045e9ff3f
author Noufal Ibrahim <noufal@..> 1322165467 +0530
committer Noufal Ibrahim <noufal@..> 1322165467 +0530

Added a .md extension to README

您还可以在 .git/objects/73/47addd901afc7d237a3e9c9512c9b0d05c6cf7 中查看对象本身。

您可以像这样检查其他对象。每个提交都指向一棵代表该时间点文件系统的树,并且有一个(或多个在 merge 提交的情况下)父级。

对象作为单个文件存储在 objects 目录中。这些被称为松散物体。当您运行 git gc 时,无法再访问的对象将被删除,其余的将打包到一个文件中并进行增量压缩。这更节省空间并压缩存储库。运行 gc 后,您可以查看 .git/objects/pack/ 目录以查看 git packfiles。要解压它们,您可以使用管道命令 git unpack-objects 命令。 .git/objects/info/packs 文件包含当前存在的包文件列表。

引用资料

接下来您需要知道什么是引用。这些是指向某些提交或对象的指针。您的分支机构和其他类似的东西被实现为引用。有两种“真实”(类似于文件系统中的硬链接(hard link))和“符号”(指向真实引用的指针——类似于符号链接(symbolic link))。

这些位于 .git/refs 目录中。例如,在上面的存储库中,我在 master 分支上。我最近的提交是

noufal@sanitarium% git log -1
commit 7347addd901afc7d237a3e9c9512c9b0d05c6cf7
Author: Noufal Ibrahim <noufal@...>
Date: Fri Nov 25 01:41:07 2011 +0530

Added a .md extension to README

您可以看到位于 .git/refs/heads/master 的我的 master 引用指向此提交。

noufal@sanitarium% more .git/refs/heads/master
7347addd901afc7d237a3e9c9512c9b0d05c6cf7

当前分支存储在位于 .git/HEAD 的符号引用 HEAD 中。在这里

noufal@sanitarium% more .git/HEAD
ref: refs/heads/master

如果你切换分支,它会改变。

类似地,标签也是这样的引用(但它们不像分支那样是可移动的)。

整个存储库仅使用提交的 DAG 进行管理(每个提交都指向代表某个时间点的文件的树)和指向 DAG 上各种提交的引用,以便您可以操作它们。

进一步阅读

  • 我有一个用于我的 git 培训的演示文稿 here这解释了其中的一些。
  • 社区图书 http://book.git-scm.com/有一些关于内部结构的部分。
  • Scott Chacon 的 Pro Git 书中有一节关于 internals
  • 他还有一个 peepcode PDF只是关于内部结构。

关于c# - Git 仓库内部格式解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8266871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com