Git合并策略:忽略已删除的文件

27

我有一个特殊的分支(发布分支),它是主分支的精确副本,但删除了一些文件和目录。在这个分支上不进行开发,但必须与主分支同步,因此必须不断将主分支的更新推送到该分支。

通过执行普通合并(git merge master),我经常遇到冲突,例如(例如使用示例README文件):

CONFLICT(delete/modify):README 在 HEAD 中被删除并在主分支中被修改

这是可以预料的:我试图合并已经删除的文件的更改。因此,为了解决这些冲突,我只需使用git rm README

为了自动化处理这个问题,我想使用指定了-X ours的自动冲突解决方案。man手册建议我这么做:

此选项强制冲突的补丁通过优先考虑我们的版本来被自动干净地解决。与我们的版本不冲突的其他树的更改会反映到合并结果中。

然而,当我执行git merge -s recursive -X ours master时,我仍然遇到相同的未解决的删除/修改冲突。我做错了什么?是否还有其他自动化冲突解决方案?


可能是重复的问题:如何设置Git驱动程序以在合并时忽略文件夹,并且那里有一个很好的答案。 - rescdsk
4个回答

23

可能有更好的方法来解决这个问题,但我通过执行合并(使用默认的合并策略)然后运行了下面的操作来解决类似的问题。

git status | grep 'deleted by us' | awk '{print $4}' | xargs git rm

完成后,您应像通常一样解决其他冲突,然后提交。

这只是删除了在当前分支上已被删除的所有文件,我认为这就是你想要的。


9
git merge master
git status --porcelain | awk '{if ($1=="DU") print $2}' | xargs git rm
git commit

3
通过查看这个问题,似乎使用递归策略我们他们选项的方式并不会将删除视为冲突。
但你可以使用此功能来指定某些文件的特定策略。我敢打赌我们策略(而非选项)对这些文件很有用。 编辑: 正如评论中所述,你不能这样做!
如果这对你非常重要,你应该联系Git邮件列表(git@vger.kernel.org)。

看起来这可能是解决方案,但对我不起作用(或者我又做错了什么):在创建并提交的分支中,使用内容为“README merge=ours”的.gitattribute文件。当我执行git merge master时,出现相同的冲突。 - Vladimir Minakov
1
尝试创建一个.gitignore文件,然后将README放入其中。结果相同。 - Vladimir Minakov
1
也许,自定义合并驱动程序是我需要的东西?https://dev59.com/jHNA5IYBdhLWcg3whuR_ - Vladimir Minakov
哦,是的,那就是昨天被打断时我要测试的内容。 - Antoine Pelisse
3
实际上它是无效的,合并驱动程序甚至没有被调用,这就是为什么没有策略能正确处理它的原因。 - Antoine Pelisse

-2

你可以使用 rebase 而不是 merge 来实现发布分支的更新。


4
那样会有什么不同呢? - Antoine Pelisse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接