Git – 如何强制合并冲突和手动合并选定的文件

我们维护具有常用主分支和多个并行分支的Web应用程序,每个安装一个,每个安装都没有特定的变化。 源代码在git中进行pipe理,当我们需要将主分支转移到并行转移function和bug修复时,它是非常棒的工具。 但是很less有敏感和自动合并的文件通常会给出不好的结果。 所以合并会容易得多,如果他们可以以某种方式标记,每一个合并会导致需要手动合并的冲突。

我search了一个答案:

  1. 我正在使用–no-commit–no-ff合并选项,但它不一样。
  2. 这里和这里有人问同样的问题,但没有解决scheme。
  3. 类似的情况似乎是如何防止文件被合并使用.gitattributes包含: somefile.php合并=我们 。 我试图find一些合并选项,这将产生冲突或强制手动合并,但迄今没有发现。
  4. .gitattributes包含: somefile.php -merge不会自动合并,因此强制手动合并。 这是90%的解决scheme,但我所追求的是尝试自动合并,并将其标记为冲突,无论成功与否。 但是这与解决scheme非常接近。 (…感谢Charles Bailey澄清…)
  5. 有人build议编写自定义合并驱动程序( 1,2 ),但如何做到这一点对我来说是远远不够的。

编辑:变种4.描述

选项5,一个自定义的合并驱动程序,可能是最接近你想要的。 这很容易做到。 下面是一个我认为应该让你非常接近你想要的行为的例子。

首先,创build一个名为merge-and-verify-driver的合并驱动程序脚本。 使其可执行并将其放置在合适的位置(您可能需要考虑将此脚本检入到回购站,即使回购的configuration文件将依赖于它)。 Git将执行这个shell脚本来执行敏感文件的合并:

 #!/bin/bash git merge-file "${1}" "${2}" "${3}" exit 1 

这只是Git自己通常所做的默认合并行为。 主要区别在于,脚本总是返回非零值(表示存在冲突,即使合并实际上已经解决而没有冲突)。

接下来,您需要告诉Git您的自定义合并驱动程序的存在。 你在repo的configuration文件( .git/config )中这样做:

 [merge "verify"] name = merge and verify driver driver = ./merge-and-verify-driver %A %O %B 

在这个例子中,我把merge-and-verify-driver放在回购的顶层目录( ./ )中。 您将需要相应地指定脚本的path。

现在,您只需要为敏感文件提供适当的属性,以便在合并这些文件时使用自定义合并驱动程序。 将其添加到.gitattributes文件中:

 *.sensitive merge=verify 

在这里,我告诉Git,名称匹配模式*.sensitive任何文件应该使用自定义合并驱动程序。 显然,你需要使用适合你的文件的模式。

注意:这篇文章“ 编写PO文件的git合并驱动程序 ”说明了手动合并文件时可以执行的操作types:可以预处理它,以便手动合并以准备好某些数据。

可以使用git merge-file ,例如, 在合并 (!) 之前对文件进行DECRYPT(和重新encryption)文件 。

在你的情况下,以非0状态退出合并驱动程序确保合并将是手动的。