我想知道 VCS(例如 Github)如何根据上游提交更新数据库? git push 如何将文件发送到 VCS?
提前致谢!
我不确定您是否意识到您在这里问的问题有多大。 😀
正如 phd 在评论中指出的那样,GitHub 并不是 Git 本身:
github.com
是提供 Git 存储库存储以及许多附加功能的托管站点的名称。 今天另外两个大的是 Bitbucket 和 GitLab,毫无疑问还有许多较小的。 Git(至少是最初的 C 实现)是一套实现版本控制系统的工具,并定义了一组通信和文件格式协议。 其他实现(JGit、Go-Git 等)也使用这些相同的协议和文件格式。
[H][托管服务]如何根据上游提交更新数据库?
我根本不清楚你所说的“数据库”是什么意思。 例如,GitHub 既存储存储库(不是由一个而是由“两个”主数据库组成),又存储其自己的与存储库关联的第三个数据库。 第三个数据库包含问题和代码审查等内容。 无论如何,在其他地方进行的提交通常不会对任何这些数据库产生影响,直到您(或有权访问它们的任何人)调用某些特定操作。 GitHub 特别需要 git push
和/或 GitHub 端“拉取请求”操作,以便在 GitHub 上存储的存储库中直接访问提交。
(这里的“直接访问”包括“容易找到”的概念。由于 GitHub 存储提交的方式,如果您知道提交哈希 ID,有时可以访问提交,即使它名义上尚未“在“存储库。)
从技术上讲,事实并非如此。 它发送
对象。 这里的细节变得非常复杂,但在顶层,我们可以将其视为信息交换:发送 Git 向接收 Git 提供特定的提交哈希 ID。 接收的 Git 使用以下两个选项之一进行回复:我已经有了该提交向我发送该提交
或
。 向我发送该提交当然意味着接收者没有有该提交。 这意味着“仅”出现在该提交中的任何文件“必须”被发送。 该提交和其他提交中的文件可能不需要发送。 如果必须发送提交,则发送者必须提供提交的父级;接收者像以前一样回复每个报价:“是,发送”或“否,我有”。 此外,是的,发送该提交回复会调用更多报价,直到发送者发现必须发送的每个提交,并且通过“不,谢谢,已经有了那个”回复的暗示,现在可以确定哪个内部树和 blob 对象 接收者已经拥有。
确定必须发送哪些对象以及接收者已经拥有哪些对象后,Git 现在可以准备一个所谓的“瘦包”,其中发送者上要发送的对象根据已知的数据进行增量压缩- 接收器上存在物体。 Git 使用的任何“智能”协议都利用了这个技巧。 如果您正在运行 git push
,您将看到 Git 打印有关计数和压缩对象的消息。 如果您正在运行 git fetch
(其中您的 Git 从其他存储库获取提交和其他对象),您将看到您的 Git 首先接收对象,然后必须计算、检查并修复传入的对象(Git 不会) t 储存“薄包装”,因此必须先“固定”包装以使其厚度适当)。
(您可能还想查看我的原型书目前的第 4 章,以获取更多信息,当然Pro Git 书也有很多内容要说。)
对于 Git,特别是 git-push(1):服务器必须支持该协议 客户(您)正在使用的版本。 目前看来是
v0
,
v1
和v2
(或者最后一个可能正在进行中)。 那么他们必须
支持“Git 协议”URL (git://
)、HTTP、HTTPS 或 SSH。 IE。这取决于您使用的 URL。 对象和引用(例如分支)通过线路(例如 HTTPS)发送,并且 服务器将它们存储在服务器存储库中。 Git 记录了 协议和一切。 参见示例:
git 协议功能(5)
git协议-http(5)
git协议包(5)
gitprotocol-v2(5)