我们维护具有通用主分支和多个并行分支的Web应用程序,每个安装一个,每个都没有特定的更改。源代码在git中管理,当我们需要从主分支到并行分支的传输功能和错误修正时,它是非常好的工具。但是很少有敏感的文件和自动合并通常会产生不好的结果。因此,如果它们可以某种方式标记并且每次合并都会导致需要手动合并的冲突,那么合并将会容易得多。
我搜索了一个答案:
编辑变体4.说明
答案 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)
第一个命令在创建合并提交之前停止合并,第二个命令将在两个分支中修改的所有文件标记为冲突,即使最初没有冲突也要解决。