- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
是否有关于 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 上各种提交的引用,以便您可以操作它们。
关于c# - Git 仓库内部格式解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8266871/
Hortonworks 数据平台 HDP 3.0 有 spark 2.3 和 Hive 3.1,默认情况下 spark 2.3 应用程序(pyspark/spark-sql 等)使用 spark 数据
是否最好让一个软件仓库包含多个文件夹,这些文件夹映射到工作区中的不同路径。或者一个仓库中的多个文件夹映射到多个工作区,或多个仓库映射到多个工作区。 有人对此事有任何实用建议吗? 我还注意到,当我在仓库
Git 是分布式源代码控制系统,对吧。如何在没有集中存储库的情况下连接两个开发人员。 我们的团队使用 Github,如果两个开发人员想在同一个分支上工作,似乎需要将该分支推送到远程,然后他们才能访问它
Maven – 仓库 什么是 Maven 仓库? 在Maven 的术语中,仓库是一个位置(place),例如目录,可以存储所有的工程 jar 文件、library jar 文件、插件或任何其他的工
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 3年前关闭。 Improve this questi
我开始将 git 与我的 .git 目录以及网络根目录中的其他所有内容一起使用。进一步阅读后,这似乎是一种不好的做法。我现在将我的应用程序和系统文件夹放在网络根目录之外。我的网络根目录中唯一剩下的就是
有没有可能没有历史的 Git 仓库?例如,我有一个我工作的本地 Git 存储库,我想将最新版本推送到生产服务器。生产服务器上不应存储任何历史记录。我该怎么做? 最佳答案 你可以看到命令 git arc
Laravel 中的 Repositories 有什么优势?它似乎是从应用程序的业务逻辑中抽象出模型层。虽然这似乎只是让整个请求生命周期变得更加复杂,但收效甚微。 有人可以阐明 Laravel 存储库
我有一个本地 git 服务器在我的 NAS 上运行,我正在我的笔记本电脑和工作站上进行开发,所有这些都在我的本地网络中。所以,如果我想在一个新的空 repo 中开始一个项目,我会关注 this ans
我们正在使用 SVN 来存储 maven 依赖项(组织限制不能像现在那样使用 nexus 或 artifactory maven 存储库)。 SVN 在使用 https 协议(protocol)的网络
我想允许某人查看我在我的私有(private)存储库中所做的工作。我该怎么做? 我看了https://help.github.com/articles/making-a-private-reposit
我试图阻止同事在 git 中再次推送已删除的标签(因为它被错误地推送了一次)。 我知道如何在本地执行此操作以及如何将其推送到远程以及如何指示我的同事以正确的方式从他们的本地存储库中删除已删除的标签。
我已经使用 url 克隆了一个 friend 的 git repo git 克隆 https://github.com/user/repo_name.git 然后我创建了我的分支,提交并尝试将我的代码
我目前正在我的代理机构安排比赛。我想对开发人员可以使用的模块进行一些管理。 是否可以托管 Play 模块和 Maven 库的镜像存储库并将 play 配置为仅使用这些存储库? 我已阅读此内容 docu
我正在尝试在我的 readme.md 中嵌入图像用于在 GitHub 上显示。我以前在公共(public)存储库中没有遇到任何问题,格式如下: ![header image](https://raw.
我想访问公司内部Artifactory实例上自定义开发的Gradle插件。对于公司内部发生的每一个Gradle构建,我都希望如此。我是否缺少任何东西,或者建议的方法是在每个项目的每个Gradle构建之
我想保留我在 docker hub 帐户中使用的图像,同时保持对拉取图像的引用。就像你在 github 上 fork 一个项目一样。 目前我已经尝试过jwilder/nginx-proxy图片。现在我
Perforce 中是否有命令可以获取客户端从软件仓库映射到特定文件夹的信息? 示例: 我有仓库位置//depot/myfolder/somefile.java 我想知道哪些客户端将此位置映射到哪个路
我被指派为一个项目开发一项功能。在几周的时间里,我将花几天时间研究该功能。我将克隆中央仓库。然后我将在本地工作 3 周。在此过程中,我会多次将我的进度提交到我的 repo 协议(protocol)中。
我发现自己越来越喜欢将Rstudio与R markdown文件(.rmd)一起使用,并且我非常喜欢“编织HTML +发布到Rpubs”的便利与同事共享我的工作。不幸的是,发布的文件必须是公开可见的,而
我是一名优秀的程序员,十分优秀!