如何创建类似 VCS 的冲突合并文件?

How to create VCS-like conflict-merging file?

我正在尝试生成类似 "unresolved-conflict" 的文件,但没有成功。

我查看了 diff 联机帮助页并在谷歌上搜索了差异、合并等...但我只找到了有关如何处理这些文件的信息,但没有找到有关如何实际生成它们的信息。

明确地说,我想要做的是,有两个相似的文件,生成一个自动合并的文件,类似于大多数 VCS 系统,如 Git 或 Subversion 在 "conflict" 中生成文件状态。

主要目标是能够快速编辑它以手动解决所有差异,就像我在 Git 或 Subversion 中所做的那样,但无需在任何 VCS 系统中使用它们。

我 "almost" 使用 diff -C 1000000 命令成功生成了完整差异(因为我不会有太大的文件,上下文限制是完全可以接受的)。

...但是生成的文件包含所有已修改的行。即:在公共行前加上“-”或“+”(取决于它来自第一个文件还是第二个文件)或“”(space)。

我将获得一个 "almost unchanged" 文件,其中包含以下示例强调差异的部分:

<<<<<<<< File1
Section from File1
Foo
========
Section from File2
Bar
>>>>>>>> File2

编辑:

正在回答@s.m。评论,我在这里解释一下我的确切目标是什么(因为在评论中解释太长了):

我在一台服务器上工作,分配多个 PostgreSQL 集群作为不同主机的热备份。

我已经在生产服务器上成功实施了二进制 full/incremental 备份 (bacula),并且还有一个帮助脚本来配置热备用服务器。

但现在我们必须一一设置(并维护 - 最好是定期检查 -)所有这些。

为了简单起见,我们计划创建单个(或可能多个)"Super"-hot-standby 服务器,其中包含复制不同主服务器的多个集群。

我的目标是用一个脚本轻松创建新的备用集群,而无需太复杂的调整,也不必担心备份设置(因为所有集群将立即备份)。

我几乎成功地实现了那个脚本:它在空闲端口创建一个新集群,调整所需的配置参数并使其与主服务器同步。

这些调整是通过 "default" 配置文件进行的,但一些主控可能有特殊的配置参数(特别是内存调整)必须在备用时复制,否则,它可能无法复制一些操作掌握)。还有 pg_haba.conf 定义了哪些 users/servers 可以连接,我们也希望在备用时复制它(用于最终的故障转移)。

所以,为了更容易(并且更不容易出错)合并两个配置文件,我实现了一个 bash 函数来从 masters 检索配置文件,现在,我的目标是将它与前面提到的合并"default-tuned"一个。

这样,添加新的备用数据库就像执行我们提供主网络名称的脚本并查看自动合并的文件以手动解决合并中遇到的一些差异一样简单。

编辑 2:

明确地说,我试图按优先顺序做的是:

  1. 仅使用 GNU Diff(如@s.m。在他的评论中指出)甚至通过使用复杂的参数或管道连接到通常在大多数 unix* 系统上可用的外部工具来实现它,所以我可以将它包装在一个 bash 函数中并在我的脚本中使用它而不需要依赖。

  2. 使用一些现有的工具(但不是重新发明轮子)。

  3. 实现我自己的工具并使用它。

没有更好的解决方案,我最终尝试实现自己的工具(我称之为'humandiff')来解决它。

我在 Github and uploaded as npm package 中发布了它,因此我现在可以在生产服务器中从 npm 安装它。

甚至认为它需要一些设置才能安装。即:

  • 安装 NodeJS 和 NPM(sudo apt-get install nodejs-legacy npm 在类 debian 系统中)。
  • 安装 humandiff 本身 (sudo npm install -g humandiff)。

用法和输出示例可以在README file中找到,所以我不再扩展了。

我post这个答案只是为了以防万一有人遇到同样的问题,但无论如何,也欢迎更好的解决方案。

编辑: 我没有说,即使很明显,事实上我根本没有实现任何差异算法。我只是注意到 GNU diff 和其中一个原始文件提供的位置和偏移元数据可以构建另一个或 merged 文件正在寻找,所以我只是实现了一个包装器来解决这个问题。但是,我没有调用 GNU Diff 二进制文件,而是在 NPM 存储库中找到了一个同样命名为 "diff" 的模块,它为我提供了同样的任务。