Git 存储库内部格式解释

2024-02-26

有没有关于 Git 如何在其存储库中存储文件的文档?我尝试在互联网上搜索,但没有可用的结果。也许我使用了不正确的查询,或者也许这是一个伟大的秘密——Git 存储库内部格式?

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

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

提前谢谢了!


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

这是缩略图。

Objects

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

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

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.

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

对象作为单个文件存储在objects目录。这些被称为松散物体。当你跑步时git gc,无法再访问的对象将被修剪,剩余的对象将打包到单个文件中并进行增量压缩。这可以提高空间效率并压缩存储库。运行 gc 后,您可以查看.git/objects/pack/目录查看 git packfiles。要解压它们,您可以使用plumbing命令git unpack-objects命令。这.git/objects/info/packs文件包含当前存在的包文件列表。

参考

接下来您需要知道什么是参考文献。这些是指向某些提交或对象的指针。您的分支机构和其他类似的东西将作为参考实施。有两种“真实”(就像文件系统中的硬链接)和“符号”(指向真实引用的指针 - 就像符号链接)。

这些位于.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

你可以看到我的master参考位于.git/refs/heads/master指向此提交。

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

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

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

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

同样,标签也是这样的引用(但与分支不同,它们不可移动)。

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

进一步阅读

  • 我有一个用于 git 培训的演示文稿here http://nibrahim.net.in/presentations/git/index.html这解释了其中一些原因。
  • 社区预订位于http://book.git-scm.com/ http://book.git-scm.com/有一些关于内部结构的部分。
  • Scott Chacon 的 Pro Git 书中有一节介绍了内部结构 http://progit.org/book/ch9-0.html
  • 他还有一个窥视代码 PDF http://peepcode.com/products/git-internals-pdf只是关于内部结构。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Git 存储库内部格式解释 的相关文章

  • 如何创建语法突出显示文本框[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何使用 C Net 创建语法突出显示文本框 Take 闪烁网 http scintillanet codeplex com 并采取其
  • 命名管道客户端无法连接到作为网络服务运行的服务器

    我有一个服务在网络服务帐户下运行 该服务只是设置一个命名管道并侦听连接 NamedPipeServerStream listeningPipe new NamedPipeServerStream ourservicepipe PipeDir
  • 表达式访问者仅为某些 lambda 表达式调用 VisitParameter

    我希望能够使用嵌套扩展方法将 EF 中的实体投影到相应的视图模型 参见我之前的问题使用扩展方法在 EF 中投影单个实体 https stackoverflow com questions 39585427 projection of sin
  • OpenCV SVM 给出奇怪的预测结果

    我对 OpenCV 和支持向量机都很陌生 我想使用 SVM 训练具有两个标签的数据集 然后预测给定集合的标签 我当前的集合包含大约 600 行 具有相等的类分布 1 为 300 行 1 为 300 行 包含 34 列 这是我当前用于设置 O
  • 错误:“运行所选代码生成器时出错:包恢复失败”

    我正在尝试将控制器添加到 ASP NET Core 项目中的解决方案中 当我尝试这样做时 我收到此错误 我收到相同的消息 为控制器添加最小依赖项和完整依赖项 我也有这个问题 使用实体框架添加控制器 gt 带有操作的 API 控制器 将给出
  • 等待运算符错误

    我的代码有问题 我怎么解决这个问题 这个问题出现在await操作符中 public MyModel HttpClient client new HttpClient HttpResponseMessage response await cl
  • 提取单花括号内的值

    我想要一个收藏 value 一个字符串使用正则表达式 例如 lorem ipsum field1 lorem ipsum field2 lorem ipsum field1 lorem ipsum field2 field3 我会得到 fi
  • C 链表销毁函数

    我正在尝试学习 C 和很多人一样 我对指针有点困惑 无论如何 我创建了一个递归函数来销毁我的链表 但是正如我调试的那样 当我从函数返回时 列表的头部不应该为空 所以我猜这是对指针的一些基本误解 这是函数 void destroy struc
  • 将视频上传/保存到数据库或文件系统

    我以前从未尝试过保存视频 所以我对此了解不多 我知道如果视频很小 我可以转换为字节数组并保存到数据库 但是为了提高效率 我想了解如何将任何上传的视频保存到我的服务器文件中 然后只保存该文件的文件路径我的数据库表中的视频 我完全不知道如何开始
  • 可以通过模板间接访问基类中的私有类型

    我试图在编译时根据类型是否在给定范围内公开可用来选择要使用的类型 最好直接看代码 include
  • _MM_TRANSPOSE4_PS 在 GCC 中导致编译器错误?

    我第一次在 GCC 而不是 MSVC 中编译我的数学库 并经历了所有的小错误 我遇到了一个根本没有意义的错误 Line 284 error lvalue required as left operand of assignment 284号
  • 无论我做什么,我都无法推送我的代码并不断收到相同的错误

    我正在尝试将代码推送到远程分支 但不断收到此错误 rejected non fast forward error failed to push some refs to email protected cdn cgi l email pro
  • 是否自初始化 'A a = a;'允许吗?

    此代码在运行时在复制构造函数中失败 但编译器 MSVS2008 没有发出警告 您能解释一下 最好引用标准 这段代码是否非法或什么 我理解 A a a 永远不应该写在第一位 但我正在寻找理论背景 class A public A p new
  • FFplay成功移入我的Winform中,如何设置它无边框?

    用这个代码 在 C 应用程序中显示 tcp 视频流 来自 FFPLAY FFMPEG https stackoverflow com questions 14201894 show a tcp video stream from ffpla
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • Rx 在不同的线程上生产和消费

    我试图通过此处的示例代码来简化我的问题 我有一个生产者线程不断地输入数据 并且我尝试在批次之间添加时间延迟来对其进行批处理 以便 UI 有时间渲染它 但结果并不如预期 生产者和消费者似乎在同一个线程上 我不希望批处理缓冲区在正在生成的线程上
  • NSubstitute - 测试特定的 linq 表达式

    我在当前正在开发的 MVC 3 应用程序中使用存储库模式 我的存储库界面如下所示 public interface IRepository
  • 使用 DataGridViewCheckboxCell 真正禁用 DataGridView 中的复选框

    有谁知道如何使用 DataGridViewCheckboxCell 禁用 DataGridView 中的复选框 我可以将其设置为只读 并设置背景颜色 但我无法让复选框本身显示为禁用状态 有什么想法吗 Guess 你必须自己画 http so
  • 从其对象获取结构体字段的名称和类型

    例如 我有一个类似这样的结构 struct Test int i float f char ch 10 我有一个该结构的对象 例如 Test obj 现在 我想以编程方式获取字段名称和类型obj 是否可以 顺便说一句 这是 C 你正在要求C
  • 从 C/C++ 程序进行 Ping

    我想编写一个 C 或 C 程序 给定一个 IP 地址 对其进行 Ping 然后根据 Ping 是否成功执行进一步的操作 这个怎么做 尽情享受Ping 页面 http www ping127001 com pingpage htm 其中有一个

随机推荐

  • CS193P - 添加取消按钮到 iOS 计算器

    我最近开始在 iTunes U 上学习斯坦福大学的 iPhone 开发在线课程 我现在正在尝试做前几堂课的家庭作业 我按照演练构建了一个基本计算器 但现在我正在尝试第一个作业 但我似乎无法解决它 这是一个如下 添加一个 C 按钮来清除所有内
  • 协变在颤振中的作用

    我正在浏览 dart 文档 在那里我遇到了这段代码和这个术语covariant 我浏览了一些文档 但我不明白它是什么function那里 详细解释的答案总是值得赞赏的 class Animal void chase Animal x cla
  • 在 Firebase 中保存数组

    我使用 Firebase 3 0 作为后端 我需要保存我的每一个user uid在一个单独的子对象中 它需要是一个 NSArray 然后使用 for 循环检索该数组 这就是我保存数据的方式 我为 FIRController 创建了一个单独的
  • 在 Python 中验证字典

    我正在寻找工具或示例来 如何在 python 中验证字典 例如 我有字典 test foo bar nested foo1 bar1 foo2 bar2 现在我必须验证它 可以说 键值foo必须是布尔值False或非空字符串 接下来 如果关
  • 如何在 Visual Studio 2012 for Windows 8 上编译和执行 C 程序?

    我一直在寻找适用于 Windows 8 的 C 编译器 然后发现我可以在 Visual Studio 上编译 C 程序 微软提供了一个演练 http msdn microsoft com en us library vstudio bb38
  • 如何在 podspec 中添加捆绑目标

    我想做一个 podspec这个静态库 https github com thestk stk tree master iOS 在图书馆的 Xcode 项目中 我有一个 a图书馆的目标 以及 bundle目标为bundle https dev
  • flutter 中的多选项卡/页面视图

    如何在 flutter 中创建多页面视图 其中页面对应于底部导航栏中的选项卡 以便与页面对应的小部件仅按需构建一次 例如 考虑一个简单的 facebook 应用程序类型的 UI 带有两个选项卡 提要和具有以下行为的通知 提要和通知都是通过网
  • 当弹出窗口打开时,单击 Windows 标题栏的最小化、最大化和关闭按钮不起作用

    当我的弹出窗口打开时 第一次单击最小化或最大化或关闭按钮不起作用 第一次单击这些标题栏按钮将关闭弹出菜单并转移焦点 然后第二次单击窗口的最小化 最大化 关闭 有什么方法可以在第一次单击时激活这些标题栏按钮吗 主窗口 xaml
  • 切换目标框架后 System.Data.SQLite.DLL 不再加载

    我不得不从 net 4 5 切换到 net 4 0 因为我的一些客户仍然使用 WinXP 现在 切换后 这是我收到的错误 Could not load file or assembly System Data SQLite Version
  • C# 结合 GeckoFX + Tor.NET 库

    我正在尝试结合 GeckoFx 库和 Tor NET 库 在我的代码中 我做好了使用 tor 网络的所有准备 ClientCreateParams createParameters new ClientCreateParams create
  • Netbeans 8.2 无法验证 Git 凭据?

    我正在制作一个 Java 项目 该项目已在 github 上进行了多次提交 我最近将 Kubuntu 上的操作系统版本从 17 10 gt 18 04 更改 并安装了带有 Java 版本 1 8 0 171 的 Netbeans 8 2 以
  • Flutter插件:InAppPurchasePlugin.java使用未经检查或不安全的操作

    当我尝试在应用程序 pubspec yaml 文件中添加 in app purchase 插件时 会发生以下错误 就在添加插件之后 与任何特定代码无关 Note Users tanzimfahim flutter pub cache hos
  • GetAltTabInfo 用法?

    我无法使用 GetAltTabInfo 可能是一个愚蠢的错误 但这有什么问题呢 HWND taskSwitcher FindWindow L TaskSwitcherWnd L Task Switching ALTTABINFO altTa
  • 如何在android中的字符串中的每个“\n”之后添加行间距?

    正如问题所明确指出的那样 我想在每个之后添加一个小行距 n在 Android 资源文件的字符串中定义 假设我们在 xml 中定义了一个字符串 如下所示
  • 重置表单,无需 JavaScript? (输入类型=重置不起作用)

    好吧 我想标题已经说明了一切 我正在寻找一种重置表单中所有字段的方法 我尝试过以下一些方法
  • 跨多个服务器扩展 Socket.IO

    我一直在寻找有关为 Node js Socket IO 安装设置多服务器集群的帮助 这就是我正在尝试做的 在 F5 负载均衡器中有 1 个 VIP 指向n运行 Express 和 Socket IO 的 Node 服务器数量 让客户端通过以
  • 我应该如何 scipy.optimize 具有边界的多元且不可微的函数?

    我遇到了以下优化问题 目标函数是一个多变量且不可微的函数 它将标量列表作为参数并返回标量 它是不可微的 因为函数内的计算基于 pandas 和一系列滚动 std 等操作 伪代码如下 def target function x list gt
  • 如何强制 Xcode 使用自定义编译器?

    我想强制 Xcode 使用自定义编译器 从 src 构建的 clang llvm 以便我可以使用 clang 插件 我的Xcode版本是7 3 1 人们说使用自定义工具链是可能的 我没有对它们进行研究 因为更简单的解决方案对我来说效果很好
  • 如何更新 npm 模块,忽略 git 存储库

    我分叉了一个 npm 模块 现在它是一个 git 存储库 所以我的 package json dependencies some module git https github com my name some module git 分叉的
  • Git 存储库内部格式解释

    有没有关于 Git 如何在其存储库中存储文件的文档 我尝试在互联网上搜索 但没有可用的结果 也许我使用了不正确的查询 或者也许这是一个伟大的秘密 Git 存储库内部格式 让我解释一下 为什么我需要这些火箭科学信息 我正在使用 C 从存储库中