【问题标题】:Git merge strategy to ignore deleted filesGit合并策略忽略已删除文件
【发布时间】:2012-07-05 02:23:47
【问题描述】:

我有一个特殊的分支(发布分支),它是 master 分支的精确副本,删除了一些文件和目录。这个分支上没有开发,但是它必须与 master 同步,所以 master 上的更新必须不断地推送到那个分支。

通过进行正常的合并 (git merge master),我经常遇到类似的冲突(例如一个示例 README 文件):

CONFLICT (delete/modify): README deleted in HEAD and modified in master

这是预期的:我尝试合并已删除的文件中的更改。所以,为了解决它们,我只使用git rm README

为了自动化它,我虽然可以通过指定 -X ours 来使用自动冲突解决。手册页表明这对我来说是正确的:

This option forces conflicting hunks to be auto-resolved cleanly by favoring our version. Changes from the other tree that do not conflict with our side are reflected to the merge result.

但是,当我执行git merge -s recursive -X ours master 时,我仍然会遇到同样未解决的删除/修改冲突。我究竟做错了什么?还有其他方法可以自动解决冲突吗?

【问题讨论】:

标签: git merge


【解决方案1】:

通过查看this question,看起来带有 ourstheir 选项的 递归策略 不考虑删除作为冲突。

您可以做的是使用this feature 为某些文件指定特定策略。我敢打赌,我们的策略(不是选项)可以解决这些文件。

编辑:

如评论中所述,您不能这样做!

如果这对您来说是一个非常重要的功能,您应该明确联系 Git 邮件列表 (git@vger.kernel.org)

【讨论】:

  • 似乎它可能是解决方案,但对我不起作用(或者我又做错了什么):在分支中创建并提交 .gitattribute 文件,内容为“README merge=ours ”。当我做git merge master 时出现同样的冲突
  • 也尝试创建一个 .gitignore 文件并将README 放入其中。结果相同
  • 也许,我需要自定义合并驱动程序? stackoverflow.com/questions/928646/…
  • 哦对,这就是我昨天被打扰时要测试的内容
  • 其实不行,merge driver 也没有被调用,所以没有策略正确处理
【解决方案2】:

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

【讨论】:

  • 这会有什么不同?
【解决方案3】:

可能有更好的方法可以做到这一点,但我通过执行合并(使用默认合并策略)然后运行解决了类似的问题

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

在此之后,您应该正常解决其他冲突,然后提交。

这只是删除当前分支上已删除的所有文件,我认为这是您想要的。

【讨论】:

    【解决方案4】:
    git merge master
    git status --porcelain | awk '{if ($1=="DU") print $2}' | xargs git rm
    git commit
    

    【讨论】:

      猜你喜欢
      • 2011-02-12
      • 2018-09-08
      • 2020-11-21
      • 2016-05-02
      • 2013-02-20
      • 2012-10-12
      • 2015-11-30
      • 2016-04-04
      相关资源
      最近更新 更多