Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Git存储库内部格式解释_C#_Git_Github_Libgit2_Libgit2sharp - Fatal编程技术网

C# Git存储库内部格式解释

C# Git存储库内部格式解释,c#,git,github,libgit2,libgit2sharp,C#,Git,Github,Libgit2,Libgit2sharp,是否有关于Git如何在其存储库中存储文件的文档?我试图在互联网上搜索,但没有可用的结果。也许我使用了不正确的查询,或者这是一个伟大的秘密-Git存储库内部格式 让我解释一下,为什么我需要这些火箭科学信息:我正在使用C#从存储库获取文件历史记录。但是在libgit2sharp库中,它目前还没有实现。所以(作为一个负责人;)我需要自己实现这个特性,并为社区做出贡献 但在将内核源代码移动到github之后,我甚至不知道从哪里开始搜索 非常感谢 存储库的内部格式非常简单。Git本质上是一个内容可寻址的用

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

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

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


非常感谢

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

这是一张略图

物体 Git将其内部数据结构存储为。有四种对象:blob(类文件)、trees(类目录)、commit(文件系统在特定时间点的快照以及如何到达该时间点的信息)和tags(用于标记重要时间点的提交指针)

如果您查看存储库的
.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/refs/heads/master
的my
master
引用指向此提交

noufal@sanitarium% more .git/refs/heads/master
7347addd901afc7d237a3e9c9512c9b0d05c6cf7
当前分支存储在位于
.git/HEAD
的符号引用
HEAD
中。给你

noufal@sanitarium% more .git/HEAD
ref: refs/heads/master
如果您切换分支,它将改变

类似地,标记也是这样的引用(但与分支不同,它们是不可移动的)

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

进一步阅读
  • 我有一个用于git培训的演示文稿,解释了其中的一些内容
  • 位于的社区手册中有一些关于内部内容的章节
  • Scott Chacon的Pro Git书中有一节是关于
  • 他也有一个关于内部的想法
你可以深入研究其他开源git实现Hanks Marian,你能推荐一个吗?我建议从这里开始,你能说明运行
git gc
时会发生什么吗?据我所知,对象被打包到一个文件中。信息量很大。我想Alexey很难在不调用任何git命令的情况下手动解析通用数据库。谢谢。解析数据库的一种方法是通过使用git管道命令。一些子流程接口和解析回复。管道是API,因此库将更加健壮(尽管速度较慢)。我相信红宝石砂砾就是这样工作的。另一种选择是实际实现C#函数来解析数据库,这会更费力、更难维护,但会更快、更“原生”。还有第五种类型的对象:Note对象。请参阅:@Tower:Notes不是对象类型;它们的存储方式与常规历史完全相同。
noufal@sanitarium% more .git/HEAD
ref: refs/heads/master