可执行的merge.exe(从MSYS2中提取)未在Windows上运行

1。问题已解释

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

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

这将使我们无法解释为什么这些要求如此重要。拜托,只要按原样带走它们即可。


2。第一次试用:运行msys可执行文件

我在C:/msys64中安装了MSYS2,并在以下位置找到可执行文件:C:/msys64/usr/bin/merge.exe。因此,请尝试一下STEP1〜STEP3。

STEP 1
如果将C:/msys64/usr/bin/添加到PATH env变量中,我可以在 Windows本地终端中运行它:

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

哈雷!

STEP 2
不幸的是,当我不修改PATH env变量并改为通过其完整路径调用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旁边。为什么找不到它们?

第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帖子中提供的解决方案,但它们也不起作用:

RCS on Windows - rcsmerge always fails


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.exe C:/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

iCMS 回答:可执行的merge.exe(从MSYS2中提取)未在Windows上运行

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

enter image description here

您可以将diff3.exe放在任意目录中,只要您不要忘记复制以下dll:

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

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

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

不幸的是,仍然需要将文件夹添加到PATH env变量中。但是,实际的使用目标是从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')
本文链接:https://www.f2er.com/1791572.html

大家都在问