Git - 如何在所选文件上强制合并冲突和手动合并

时间:2011-02-22 05:39:58

标签: git merge branch conflict manual

我们维护具有通用主分支和多个并行分支的Web应用程序,每个安装一个,每个都没有特定的更改。源代码在git中管理,当我们需要从主分支到并行分支的传输功能和错误修正时,它是非常好的工具。但是很少有敏感的文件和自动合并通常会产生不好的结果。因此,如果它们可以某种方式标记并且每次合并都会导致需要手动合并的冲突,那么合并将会容易得多。

我搜索了一个答案:

  1. 我正在使用 - no-commit - no-ff 合并选项,但它不一样。
  2. Herehere有人问同样的问题,但没有解决方案。
  3. 类似的情况似乎是how to prevent file being merged使用.gitattributes包含: somefile.php merge = our 。我试图找到一些合并选项,它会产生冲突或强制手动合并但到目前为止没有找到。
  4. .gitattributes包含: somefile.php -merge 永远不会自动合并,因此强制手动合并。它是90%的解决方案,但我所寻求的是尝试自动合并并将其标记为冲突,无论它是否成功。 但这是最接近解决方案的。 (...感谢Charles Bailey澄清......)
  5. 有人建议编写自定义合并驱动程序(12),但如何做到这一点对我来说还不是很清楚。
  6. 编辑变体4.说明

3 个答案:

答案 0 :(得分:55)

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

首先,创建一个名为merge-and-verify-driver的合并驱动程序脚本。使其可执行并将其放在合适的位置(您可能需要考虑将此脚本检入到repo中,因为repo的配置文件将取决于它)。 Git将执行此shell脚本来执行敏感文件的合并:

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

这只是Git本身通常所做的默认合并行为。关键区别在于脚本始终返回非零(表示存在冲突,即使实际已解决合并而没有冲突)。

接下来,您需要告诉Git您的自定义合并驱动程序是否存在。您可以在repo的配置文件(.git/config)中执行此操作:

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

在这个例子中,我将merge-and-verify-driver放在repo的顶级目录(./)中。您需要相应地指定脚本的路径。

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

*.sensitive merge=verify

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

答案 1 :(得分:0)

注意:本文“Writing a git merge driver for PO files”说明了手动合并文件时可以进行的操作:您可以对其进行预处理,以便手动合并以准备好某些数据。

例如,

git merge-file可用于DECRYPT (and re-encrypt) files before merging(!)

在您的情况下,以非0状态退出合并驱动程序可确保合并为手动合并。

答案 2 :(得分:0)

这两个命令似乎与使用自定义合并驱动程序具有相同的效果:

git merge --no-commit your_target_branch
git checkout --conflict merge .   (do not forget the . and run it in the top dir of the repository)

第一个命令在创建合并提交之前停止合并,第二个命令将在两个分支中修改的所有文件标记为冲突,即使最初没有冲突也要解决。