本港台开奖现场直播 j2开奖直播报码现场
当前位置: 新闻频道 > IT新闻 >

报码:面向 Visual Studio 开发者的 Git 内部源代码(4)

时间:2017-07-13 12:40来源:668论坛 作者:www.wzatv.cc 点击:
树和 blob 对象:请注意,尽管提交对象包含提交的相关信息,但并不包含任何文件或文件夹。相反,包含的是指向 Git 树对象的树 ID(也是 SHA-1 值)。树对

树和 blob 对象:请注意,尽管提交对象包含提交的相关信息,但并不包含任何文件或文件夹。相反,包含的是指向 Git 树对象的树 ID(也是 SHA-1 值)。树对象和其他所有 Git 对象都存储在 .gitobjects 文件夹中。

图 6 展示了每个提交对象包含的根树对象。根树对象进而根据需要映射到 blob 对象(接下来我将介绍)和其他树对象。

报码:面向 Visual Studio 开发者的 Git 内部源代码

图 6:直观呈现表示提交的 Git 对象

由于我的项目中的第二次提交(提交 ID 为 bfeb09)包括文件和文件夹(见上面的图 4),因此我将用它来说明树对象的工作方式。图 7 中的标记 1 展示了 cat‑file ‑p bfeb09 输出。这一次,请注意,其中包含可正确引用第一个提交对象的 SHA-1 值的父属性。(请注意,此为提交对象的父引用,以便 Git 能够构造和维护提交 DAG。)

报码:面向 Visual Studio 开发者的 Git 内部源代码

图 7:使用 Git CLI 探索树对象详细信息

根树对象进而根据需要映射到 blob 对象(使用 zlib 压缩的文件)和其他树对象。

提交 bfeb09 包含 ID 为 ca853d 的树属性。图 7 中的标记 2 展示了 cat-file -p ca853d 输出。每个树对象包含与对象的 POSIX 权限掩码(040000 = 目录、100644 = 常规不可执行文件、100664 = 常规不可执行组可写文件、100755 = 常规可执行文件、120000 = 符号链接和 160000 = Gitlink)对应的权限属性、类型(树或 blob)、SHA-1(对于树或 blob)和名称。名称是文件夹名称(对于树对象)或文件名(对于 blob 对象)。观察发现,此树对象由 3 个 blob 对象和另一个树对象组成。可以看到,这 3 个 blob 分别指的是文件 .gitattributes、.gitignore 和 DemoConsole.sln,而树指的是文件夹 DemoConsoleApp(图 7 中的标记 3)。尽管树对象 ca853d 与项目的第二次提交相关联,但它的前两个 blob 表示第一次提交时添加的文件 .gitattributes 和 .gitignore(见图 4 中的标记 1)! 这些文件之所以会出现在第二次提交的树中是因为,每次提交表示的是上一个提交对象,以及当前提交对象捕获的更改。若要更深入地“遍历树”,请参阅图 7 中的标记 3,其中展示了 cat-file -p a763da 输出,包含另外 3 个 blob(App.config、emoConsoleApp.csproj 和 Program.cs)和另一个树(文件夹属性)。

blob 对象也是直接使用 zlib 进行压缩的文件。如果未压缩的文件包含文本,可以使用相同的 cat-file 命令和 blob ID 提取 blob 的全部内容(图 7 中的标记 5)。由于 blob 对象表示的是文件,因此 Git 使用 SHA-1 blob ID来确定文件是否自上次提交后发生变化;还使用 SHA-1 值对存储库中的任意两次提交进行差异对比。

标记对象:鉴于 SHA-1 值的加密字母数字性,沟通起来可能有点难。使用标记对象,可以为任何提交、树或 blob 对象分配易记名称,尽管最常见的做法是只标记提交对象。标记对象的类型分为以下两种:轻量级和注释。这两种类型的对象都作为 .gitrefstags 文件夹中的文件显示(其中,标记名称就是文件名)。轻量级标记文件的内容是现有提交、树或 blob 对象的 SHA-1。注释标记文件的内容是与其他所有 Git 对象一同存储在 .gitobjects 文件夹中的标记对象的 SHA-1。若要查看标记对象的内容,可以使用相同的 cat-file -p 命令。可以看到标记对象的 SHA-1 值,以及对象类型、标记作者、日期时间和标记消息。在 Visual Studio 中,可以通过许多种方法来标记提交。一种方法是单击“提交详细信息”窗口(见上面图 3 中的标记 3)中的“创建标记”链接。“提交详细信息”窗口(见上面图 3 中的标记 3)和“查看修订记录报告”(见上面图 3 中的标记 9)中显示了标记名称。

向存储库中的对象应用存储优化时,Git 会在 .gitobjects 文件夹中填充信息和包文件夹。我将在近期发表的文章中更全面地介绍这些文件夹和 Git 文件存储优化。

了解这 4 种类型的 Git 对象后,我发现可以将 Git 称为“内容可寻址的文件系统”,因为任意数量文件和文件夹中的任何类型内容都可以简化成一个 SHA-1 值。稍后,可以使用相应的 SHA-1 值,准确可靠地重新创建同一内容。从另一个角度来说,在惯常的密钥索引驱动查找表的高级实现中,SHA-1 是键,内容是值。此外,如果文件内容在两次提交之间没有发生变化,Git 可以节省开支,因为未发生变化的文件生成的 SHA-1 值相同。也就是说,提交对象可以引用上一次提交使用的相同 SHA-1 blob 或树 ID 值,而无需新建任何对象,即无需新建文件副本!

分支

必须先了解 Git 是如何在内部定义分支的,才能真正理解什么是 Git 分支。总的来说,这归结为理解以下两个关键词的用途:头和 HEAD。

(责任编辑:本港台直播)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容