如何为已删除文件指定 git 合并 "ours" 策略和 .git 属性?

How to specify a git merge "ours" strategy with .gitattributes for deleted files?

我的项目中有 2 个分支:A(master)和 B。在分支 B 中,master 中的一些文件已被删除。我想避免在 master 中对 B 中已删除的文件进行更改时发生合并冲突。

我已将文件添加到 .gitattributes,例如

README.adoc merge=ours

对于我的合并驱动程序,我有

[merge "ours"]
name = Always keep mine during merge
driver = true

但是我仍然遇到冲突,我无法弄清楚我做错了什么。

git merge master
CONFLICT (modify/delete): README.adoc deleted in HEAD and modified in master. Version master of README.adoc left in tree.

我做错了什么?我有 运行 git check-attr 并且它显示

README.adoc: merge: ours

我也试过 GIT_TRACE=2 但它没有提供有用的信息;它只告诉我从哪里获取二进制文件。

modify/delete 冲突是高级别 冲突。 .gitattributes中定义的Merge驱动仅用于解决low level冲突:仅当文件(a)在所有三个版本(base和两个分支提示) 和 (b) 在所有三个版本中都不同。在这里,该文件存在两个版本——基本版本和一个分支提示——并且在这两个版本中有所不同,但是第三个版本被完全删除,并且永远不会调用合并驱动程序。

对于recursiveresolvesubtree策略,高层冲突总是导致合并冲突和进程中挂起的合并。 ours 策略(-s ours,与 -X ours 扩展选项非常不同)根本不会发生高级冲突,因为它只查看当前树。 octopus 中的高级冲突(我认为)是致命的:章鱼合并完全中止。2

I want to avoid merge conflicts when there are changes in A to files that have been deleted in B.

为此,您必须编写一个合并策略。这很难。1 请参阅我对 的回答。


1我对 "hard" 的主要证据是 Git 伴随着这五个策略——resolve, [= 12=、oursoctopussubtree——尽管经过十多年的发展,Git 仍然只有这五个策略。

2我从来没有真正做过章鱼合并,所以我在这里的经验有限。