在git中提取Cherry:大文件数据是否重复?

问题描述 投票:2回答:2

我明白,如果你在git中选择一个提交,它会创建一个新的提交副本(使用新的SHA等)。

但在内部,如果有一个大的二进制文件,数据是否重复,导致repo膨胀?或者它是否足够聪明才能理解它是同一个blob?

git diskspace git-cherry-pick
2个回答
3
投票

Git非常聪明,可以继续使用相同的对象,并在您创建的提交中引用它。 (虽然我有点理解您对重复副本的担忧,因为提交本身不仅仅是重复而是重新创建。)

当文件实际发生变化时,您将创建一个新对象,从而增加了回购。


3
投票

从用户的角度来看,将提交视为“包含”文件是很自然的,但在内部,提交“引用”文件更准确。

在它的基础上,git是一个内容索引的对象存储:有一堆对象,所有对象都由它们的SHA1哈希唯一标识。在该商店的顶部,给出对象意味着代表版本控制系统的组件。

a good introduction to this on the Git website

因此,当您提交文件时,会存储多个对象:

  • 包含文件内容的“blob”对象,没有元数据
  • 包含目录列表的“tree”对象,其中包含每个文件的名称和元数据,以及其当前内容的SHA1哈希值
  • 表示提交的“commit”对象,包括提交消息,提交时间,父提交的SHA1哈希值以及要使用的目录列表的SHA1哈希值

您通常看到的SHA1是此提交对象的SHA1 - 知道git足以找到完整的提交信息,并从那里找到目录列表,并从那里找到文件内容。

当你挑选提交时,git将需要创建:

  • 一个新的提交对象,带有新的时间,父提交等
  • 可能是一个新的树对象,因为合并樱桃挑选的更改可能会导致某些文件不同
  • 具有新内容的任何文件的新blob对象;如果大文件具有与先前任何状态相同的内容,则根据定义它将具有相同的SHA1哈希,因此不会再次存储

从某种意义上说,git在这里并不“聪明” - 它不关心为什么一个对象可能被复制,它只是为每个SHA1哈希存储一个对象,如果它发现一个对象已经存在该哈希,假设它们是同一件事情。多个(可能不相关)提交引用相同文件内容的能力只是作为此存储系统的方便副作用而失败。

© www.soinside.com 2019 - 2024. All rights reserved.