1

语境

我有一个 git 存储库(“父存储库”),其中包含我在另一个存储库(“内部存储库”)中.patch使用生成的文件。git diff --binary sometag父仓库是公开的并且对拉取请求开放。根据文档,该文件包含每个更改的标题行,如下所示:

index <hash>..<hash> <mode>

这意味着每次两个协作者接触同一个文件时(即使在完全不同的行中),生成的哈希也会不同,因此索引头会发生变化,从而导致可以避免的合并冲突。

我试图删除这些索引标题,git apply但似乎仍然可以正常工作。

问题

删除索引标题行是否有任何(隐藏的)影响?它会导致二进制文件出现问题吗?

我假设该git apply工具将出于优化原因仅查看哈希值。即:“当你已经有了结果文件时,不要打扰差异”。

我知道模式标头通常嵌入在索引标头中,出于我的目的,可以缺少此信息。

4

1 回答 1

1

删除索引标题行是否有任何(隐藏的)影响?

它们并没有真正隐藏,它们只是不会伸手打你的脸(不像,比如说,Git 的索引与 交互的方式.gitignore)。

我假设该git apply工具将出于优化原因仅查看哈希值。

实际上恰恰相反。应用命令被赋予一个差异,并尝试将该差异应用到工作树和/或索引中的现有文件。这些差异具有上下文更改,并且上下文和/或更改可能与要应用差异的现有文件不匹配。如果我们应该添加:

(the BEST)

在第 12 行和第 13 行之间,应该是

one ice cream flavor
is chocolate

但现在他们读到:

the odors of skunks
and ferrets

好吧,也许那不再是最好的了,是吗?

无论如何,如果事情看起来很可疑,Git 能够使用该行在您自己的本地存储库中四处寻找,以尝试在添加差异之前index找出文件的样子。如果它可以这样做——如果它可以找到原始文件——它就可以将补丁应用原始文件。它现在有三个文件:

  • 原始文件,通过该index行找到;
  • 更新的文件,通过将补丁应用于原始文件而成功,因为该index行提供了实际的原始文件,因此补丁匹配;和
  • 您的文件版本。

git merge有了这三个版本的单个文件,Git 现在可以像在那个文件上那样做一个完整的三向合并。Git 可以判断补丁不匹配的原因是否是因为行移动了——所以现在可以将补丁应用于正确的行,例如,可能是第 52 和 53 行而不是 12 和 13 行——或者如果这是因为您进行了相互冲突的更改,现在出现了合并冲突。(也许你正确地将这些硫醇化合物识别为最难闻的东西,尽管尸胺和腐胺会让它们一败涂地。)

...使用git diff --binary sometag...

来自 Git的二进制补丁要求您拥有正确的原像(该index行给出的项目)。如果没有索引行,假设我正确读取源代码,Git 将拒绝应用补丁,使补丁本身无用。如果要删除索引行,不妨删除二进制补丁。

于 2021-02-23T00:36:25.153 回答