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

时间:2017-09-21 12:01:34

标签: merge diff

我正试图生成“未解决冲突”的文件而没有运气。

我检查了diff联机帮助页并搜索了关于差异,合并等等...但我只找到了有关如何处理这些文件的信息,而不是关于如何实际生成它们的信息。

要清楚,我要做的是,有两个相似的文件,生成单个自动合并的文件,类似于大多数VCS系统,如Git或Subversion生成“冲突”状态的文件。

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

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

...但是生成的文件包含修改的所有行。即:由“ - ”或“+”(取决于它是来自第一个还是第二个文件)或“”(空格)作为公共行的前缀。

我将获得的是一个“几乎不变”的文件,其中的部分如下面的示例强调差异:

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

修改

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

我正在服务器上分配多个PostgreSQL集群,作为不同主人的热点。

我已经在生产服务器上成功实现了二进制完整/增量备份(bacula),并且还有一个辅助脚本来配置热备用服务器。

但是现在我们必须逐一设置(并保持 - 并且理想地定期检查)所有这些。

为了简化,我们计划创建包含多个集群的单个(或可能多个)“超级” - 备用服务器,复制不同的主服务器。

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

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

这些adjustmens是通过“默认”配置文件生成的,但是某些主设备可能具有必须在待机状态下复制的特殊配置参数(特别是内存调整),否则,它可能无法复制主设备的某些操作)。 pg_haba.conf也定义了哪些用户/服务器可以连接到哪个用户/服务器,我们也希望在待机状态下进行复制(最终进行故障转移)。

因此,为了使两个配置文件合并更容易(并且更不容易出错),我实现了一个bash函数来从master中检索配置文件,现在,我的目标是将其与前面提到的“default-tuned”合并

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

编辑2:

要明确的是,我按优先顺序尝试做的是:

  1. 通过使用GNU Diff(就像他的注释中的@sm指向)来处理它,即使使用复杂的参数或管道连接到大多数unix *系统上通常可用的外部工具,所以我可以将它包装在bash函数中并使用它在我的脚本中没有依赖。

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

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

1 个答案:

答案 0 :(得分:0)

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

我在Github发布并上传为npm package,因此我现在可以从npm在producion服务器中安装它。

甚至认为需要安装一些设置。那就是:

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

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

我发布这个答案以防万一有人碰巧遇到同样的问题,但无论如何,更好的解决方案也会受到欢迎。

编辑:我错过了说,即使很明显,事实上我根本没有实现任何差异算法。我只是注意到由 GNU diff 提供的位置和偏移元数据以及其中一个原始文件可以构建另一个或者正在搜索的合并文件,所以我只是为de so实现了一个包装器。但是,我没有调用 GNU Diff 二进制文件,而是在 NPM 存储库中找到了一个名为“diff”的模块,它为我提供了相同的任务。