git中的Cherry采摘提交:大文件数据是否重复?

时间:2019-01-22 13:39:38

标签: git diskspace git-cherry-pick

我了解,如果您在git中选择一个提交,它将创建该提交的新副本(带有新的SHA等)。

但是在内部,如果有很大的二进制文件,数据是否重复,导致回购膨胀?还是足够聪明地了解它是相同的斑点?

2 个答案:

答案 0 :(得分:3)

Git 足够聪明,可以继续使用同一对象,并在您的Cherry-Pick新建的提交中引用它。 (尽管我有点理解您对重复副本的担心,因为提交本身不仅是重复的,而且是重新创建的。)

文件实际更改后,然后,您将创建一个新对象,从而增加了存储库。

答案 1 :(得分:3)

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

git是内容索引的对象存储库:有一堆对象,所有对象均由其SHA1哈希唯一标识。在该商店的顶部,赋予对象以表示版本控制系统组件的含义。

a good introduction to this on the Git website

因此,在提交文件时,将存储几个对象:

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

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

当您选择一个提交时,git将需要创建:

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

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