2

1.问题说明

我需要merge在 Windows 10 上运行该工具(GNU RCS 项目的一部分 - 修订控制系统)。这些是要求:

  • 第 1 步:可执行文件merge.exe必须在本机 Windows cmd 终端中运行。
  • 2 步:PATH不应修改 env 变量。
  • 第3 步:可执行文件可以位于任意文件夹中(当然,如果需要,可以在其旁边放一堆 dll)。

解释为什么这些要求如此重要会让我们走得太远。请按“原样”接受它们。


2.初试:运行msys可执行文件

我安装了 MSYS2C:/msys64并在这个位置找到了可执行文件:C:/msys64/usr/bin/merge.exe. 所以有时间试试STEP1~STEP3。

第 1步如果我添加到env 变量
,我可以让它在本机 Windows 终端中工作:C:/msys64/usr/bin/PATH

C:/Users/Kristof>merge.exe a.txt b.txt c.txt

万岁!

第 2
步不幸的是,当我不修改PATHenv 变量并merge.exe通过其完整路径调用时,出现问题:

C:/Users/Kristof>"C:/msys64/usr/bin/merge.exe" a.txt b.txt c.txt
/usr/bin/diff3: subsidiary program 'diff' not found

我不明白为什么会出现这个错误。毕竟,可执行文件diff3.exediff.exe都位于merge.exe. 为什么找不到他们?

STEP 3
好吧,如果我不能先让上一步工作,那么 STEP3 显然是没用的。


3. 其他试验

3.1 Purdue 二进制文件

您可以在此处找到 RCS 的二进制文件: https ://www.cs.purdue.edu/homes/trinkle/RCShome/

我从那个网站下载了 rcs57pc1.zip (1.2MB)。不幸的是,每次尝试运行merge.exe都会失败并显示以下错误消息:

diff3.exe: subsidiary program failed

我尝试了此 StackOverflow 帖子中提供的解决方案,但它们也不起作用:

Windows 上的 RCS - rcsmerge 总是失败

 

3.2 ezwinports

我从以下 网址下载了 rcs-5.7-1.zip:https://sourceforge.net/projects/ezwinports/files/

运行其merge.exe文件时,出现以下错误:

diff3.exe: Unknown signal 0xEEEEEEEE
merge aborted

事实上,我在解压缩的文件夹中看不到diff3.exe工具。因此,我从我的 MSYS 安装(位于)中复制diff3.exe 复制到解压缩的文件夹中。没有成功。相同的错误信息。diff.exeC:/msys64/usr/bin/rcs-5.7-1

 

3.3 GnuWin32

GnuWin32 项目以其许多流行工具的 Linux 到 Windows 转换而闻名。我下载了 GnuWin32 ( http://gnuwin32.sourceforge.net/ ) 并在C:/gnuwin32/. 我搜索了我的C:/gnuwin32/文件夹,但在任何地方都找不到merge.exe工具。这很奇怪,因为这里明确提到了 GNU RCS 项目作为 GnuWin32 项目的一个包:

http://gnuwin32.sourceforge.net/packages/rcs.htm

4

1 回答 1

1

解决方案是diff3.exe直接使用而不是merge.exe

在此处输入图像描述

您可以放入diff3.exe任意目录,只要您不要忘记复制这些 dll:

  • msys-2.0.dll
  • msys-iconv-2.dll
  • msys-intl-8.dll

这是如何使用可执行文件:

>diff3 -m myfile.txt ancestor.txt yourfile.txt

不幸的是,仍然需要将文件夹添加到PATHenv 变量中。但是,实际使用目标是从 Python 调用可执行文件,因此可以这样完成:

my_env = os.environ.copy()
my_env["PATH"] = "C:/merge/windows/;" + my_env["PATH"]
proc = subprocess.Popen(
    [
        merge_tool,
        "-m",
        myfile_path,
        ancestor_path,
        yourfile_path,
    ],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    env=my_env,
)

try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()
    return None
return outs.decode('utf-8').replace('\r\n', '\n')
于 2020-08-07T11:19:46.787 回答