代码之家  ›  专栏  ›  技术社区  ›  bitifet

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

  •  0
  • bitifet  · 技术社区  · 7 年前

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

    我查过了 diff manpage和googled介绍了差异、合并等。。。但我只找到了关于如何处理这些文件的信息,而没有找到关于如何实际生成这些文件的信息。

    需要明确的是,我试图做的是,有两个相似的文件,生成一个自动合并的文件,类似于大多数VCS系统(如Git或Subversion)在“冲突”状态下生成的文件。

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

    我“几乎”成功地用 diff -C 1000000

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

    我将获得一个“几乎没有变化”的文件,其中有以下强调差异的示例部分:

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

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

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

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

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

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

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

    通过这种方式,添加新的备用服务器将与执行提供主机网络名称的脚本一样简单,并查看自动合并的文件以手动解决合并过程中遇到的几个差异。

    编辑2:

    1. 只需使用GNU Diff(比如@s.m.在他的评论中指出的),甚至可以使用复杂的参数或管道到大多数unix*系统上通常可用的外部工具,这样我就可以将其包装在bash函数中,并在脚本中使用它,而不需要依赖项。

    1 回复  |  直到 7 年前
        1
  •  0
  •   bitifet    7 年前

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

    Github 并上传为 npm package 所以我现在可以在生产服务器中从npm安装它。

    • sudo apt-get install nodejs-legacy npm 在类似debian的系统中)。
    • 安装 人形差异 本身( sudo npm install -g humandiff

    README file

    我张贴这个答案只是为了防止有人碰巧有同样的问题,但无论如何,更好的解决方案也会受到欢迎。

    编辑: 我没有说,即使很明显,事实上我根本没有实现任何diff算法。我刚刚注意到,具有由提供的位置和偏移metatata GNU差异 我们正在搜索文件a,所以我只实现了一个包装器来反so。但是,不是打电话 GNU差异 二进制,我在 为同一任务提供服务的存储库。