【问题标题】:How git fork actually works?git fork 实际上是如何工作的?
【发布时间】:2019-08-25 00:35:09
【问题描述】:

我想问一下 git fork 是如何在 git 服务器中实际工作的。例如在 gitlab 中,当用户分叉一个存储库时,项目的文件实际上被复制了,或者与主存储库有一个链接(符号)?换句话说,相同的文件是否存储(到数据库)N次,每个fork一个?如果是,是不是很浪费硬盘空间?

【问题讨论】:

  • 我投票决定将此问题作为题外话结束,因为虽然它很有趣,但它纯粹是教学性的,并不代表可以解决的特定问题。跨度>
  • 尝试阅读git-fork 的文档会产生No manual entry for git-fork; git 对分叉一无所知。 gitlab 如何实现所谓的“fork”的细节将取决于 gitlab。 github会有所不同。

标签: git github gitlab


【解决方案1】:

要回答您问题的第一部分,“当用户分叉存储库时,项目的文件实际上会被复制还是与主存储库存在链接(符号)?”分叉是存储库的副本,而不仅仅是链接。存储相同的文件。

回答您问题的第二部分,“如果是,这不是浪费硬盘空间吗?”这不是一个直接回答的问题,但我可以提供我的 2 美分。一般来说,我认为 git 的去中心化组件是它的优势之一。如果您丢失了 GitHub 或 GitLab 上的远程存储库,只要您的开发人员经常拉取,您可能不会丢失很多。它还允许多个开发人员同时试验更改和添加功能,而不会影响可能仅用于生产的代码。

【讨论】:

  • 感谢您的回复。因此,没有什么聪明的方法可以避免在数据库上多次存储文件。我正在寻找一种解决方案,可以一次(在一个地方)存储多个用户的相同文件,并且只保存每个用户更改的文件(到他的本地文件夹)。
  • 如果您的意思是在 单个 数据库(单个 repo)上,对象被存储(按其内容)一次并且永远不会重复(仅在打包的文件上......但这是一个极端情况)......所以一个文件可以重命名1000次......被一遍又一遍地添加和删除......它只会在数据库中存储一次并且有数千次指向它的指针。
  • 我不是我理解你的答案。忘记 gitlab,假设我有一个具有多个用户的系统,其中起点的所有用户都有相同的 10 个文件。我想将这些文件存储一次。一种简单的解决方案是为用户本地文件夹中的每个文件创建符号链接。但是,我希望用户更改其中一个文件以仅保存此文件(删除符号链接)并保留其余 9 个符号链接(到他的本地文件夹)。这是一个非常简单的解决方案,我想知道是否有更聪明的方法。因此,我正在寻找类似的实现。
【解决方案2】:

分叉之间是否有任何特殊的去重,如果有,如何在分叉之间进行去重,部分取决于服务器。 Git提供了几种机制,例如环境变量GIT_ALTERNATE_OBJECT_DIRECTORIES和文件objects/info/alternates。有关详细信息,请参阅 the top level documentationthe git repository layout documentation。使用此方法时,小心;注意文档中的警告。

请记住,就 Git 本身而言,fork 只是一个克隆:服务器在 Git 背后记录了一些额外的信息(即使它使用 Git 的机制来执行此操作),以使“fork”具有额外的价值普通的克隆,但 Git 本身仍然幸福地不知道这些额外的信息。如果克隆过程使用本地路径(不是file://,也不是基于主机的 URL),Git 默认会尝试使用硬链接来共享对象和/或打包文件。这种共享通常是安全的,不需要特别小心。它对 Git 是可见的,但 Git 不需要在初始硬链接过程之外意识到它。

除了这些技术之外,底层操作系统还可以为文件和/或块存储提供重复数据删除方法。这些(如果存在)对 Git 本身是不可见的。在使用 Git 时,它们不需要特别小心。他们通常使用更多的计算能力来发现此类重复,并且管理起来可能很复杂,但这一切都发生在操作系统级别。

【讨论】:

  • 谢谢,但我对 git 作为 git 不感兴趣。我想知道 git 服务器是如何工作的,例如GitLab。如果用户分叉一个项目,那么文件是否会复制到特定的用户存储空间?我说的只是远程存储库。忘记本地存储库。
  • @user2277314 只有编写和/或运行 Gitlab 服务器的人才能回答 Gitlab 问题。只有运行 GitHub 的人才能回答 GitHub 问题。我只能回答 Git 问题(你也可以,因为 Git 的源代码是公开的,与支持 GitHub 的专有部分的源代码不同)。正如您从迄今为止获得的答案和 cmets 中看到的那样,您的问题不会为您提供您所寻求的答案。
  • 我明白谢谢。我只是问你是否有任何线索。
猜你喜欢
  • 2021-01-21
  • 2011-09-27
  • 2021-12-16
  • 2013-03-14
  • 2021-03-23
  • 2011-02-11
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多