84

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

我搜索了一个答案:

  1. 我正在使用--no-commit--no-ff合并选项,但它不一样。
  2. 在这里这里有人问同样的问题,但没有解决方案。
  3. 类似的情况似乎是如何防止使用包含以下内容的 .gitattributes 合并文件:somefile.php merge=ours。我试图找到一些会产生冲突或强制手动合并的合并选项,但到目前为止没有找到。
  4. .gitattributes 包含:somefile.php -merge永远不会自动合并,因此会强制手动合并。这是 90% 的解决方案,但我寻求的是尝试自动合并并将其标记为冲突,无论它是否成功。但这迄今为止最接近解决方案。 (......感谢查尔斯贝利的澄清......)
  5. 有人建议编写自定义合并驱动程序(1 , 2),但如何做到这一点对我来说还很不清楚。

编辑:变体 4. 描述

4

3 回答 3

63

选项 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-driverrepo 的顶级目录 ( ./)。您需要相应地指定脚本的路径。

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

*.sensitive merge=verify

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

于 2011-02-23T13:50:31.537 回答
2

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

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)

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

于 2018-08-14T09:13:52.830 回答
0

注意:本文“为 PO 文件编写 git 合并驱动程序”说明了手动合并文件时可以执行的操作类型:您可以对其进行预处理,以便手动合并准备好某些数据。

git merge-file例如,可用于在合并之前解密(并重新加密)文件(!)

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

于 2012-11-16T12:10:18.760 回答