合并2个文本文件,其中差异标记为冲突

时间:2019-01-24 12:11:28

标签: bash git diff

我想查看2个合并文件的完整输出,其中每个差异的标记方式都与git标记文件中的冲突相同。 用例是合并2个类似的配置文件,检查合并的文件,并具有直观的提示以表明文件之间的所有差异,以便于轻松选择哪个文件。

我已经尝试过使用diff和diff3,但是我只能得到差异(使用diff)或仅标记了冲突的完全合并的文件(使用diff3 -m -A file1 file1 file2)。我使用了git diff和相关工具,但是它们都合并了无冲突的更改,而不是将它们标记为差异。

正在运行的环境将是一个bash shell脚本,因此最好使用常见的linux工具达到所需的输出。

示例:

文件1的内容:

environment:
  base_branch: master
  branch: this_is_the_same_for_both_files

文件2的内容:

environment:
  base_branch: a_different_base_branch
  branch: this_is_the_same_for_both_files
  a_new_key: the_new_key_value

所需的输出:

environment:
<<<<< file1
  base_branch: master
=====
  base_branch: a_different_base_branch
>>>>> file2
  branch: this_is_the_same_for_both_files
<<<<< file1
=====
  a_new_key: the_new_key_value
>>>>> file2

1 个答案:

答案 0 :(得分:1)

根据评论中的建议,我想出了一款似乎可以解决我问题的衬垫。 我本来想在sed替换中使用常量作为标记,但是对于Mac OS,显然要使用包含\nsed的变量并不容易。

即使在使用diffutils的docker alpine:3.8中,此代码也似乎正常工作。 其他选项(酿造和类似的酿造法)可能不容易携带。

diff -D AAAAAAA "${path}" <(echo -n "$decrypted") | \
  sed -e $'s/#ifndef AAAAAAA/<<<<<<< file-on-disk/g' | \
  sed -e $'s/#endif \/\* ! AAAAAAA \*\//=======\\\n>>>>>>> file-from-secret/g' | \

  sed -e $'s/#else \/\* AAAAAAA \*\//=======/g' | \

  sed -e $'s/#ifdef AAAAAAA/<<<<<<< file-on-disk\\\n=======/g' | \
  sed -e $'s/#endif \/\* AAAAAAA \*\//>>>>>>> file-from-secret/g';

说明:

diff -D AAAAAAA "${path}" <(echo -n "$decrypted"):输出带有'#ifdef NAME'差异的合并文本。我正在使用AAAAAAA作为标记名称。 Diff使用#ifndef AAAAAAA#endif /* ! AAAAAAA */包围仅出现在第一个文件中的文本,而/#ifdef AAAAAAA#endif /* AAAAAAA */包围仅出现在第二个文件中的文本。请注意第一个n中的#ifndef和第一个!注释中的#endif。由于所有标记均不同,因此替换变得容易。

sed -e $'s/#endif \/\* ! AAAAAAA \*\//=======\\\n>>>>>>> file-from-secret/g':将标记替换为

=======
>>>>>>> file-from-secret

由于存在\n,所以替换字符串用$''括起来,它可以正确解释换行符。但是,\需要两次转义。