存储库的内部格式非常简单。 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只是关于内部结构。