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

标签 windows merge build msys2 rcs

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

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

  • 这将使我们无法解释这些要求为何如此重要。拜托,只要按原样使用它们即可。

    2.第一次试用:运行msys可执行文件
    我在C:/msys64中安装了MSYS2,并在以下位置找到了可执行文件:C:/msys64/usr/bin/merge.exe。因此,有时间尝试STEP1〜STEP3。
    步骤1
    如果将C:/msys64/usr/bin/添加到PATH env变量,则可以使其在 native Windows终端中工作:
    C:/Users/Kristof>merge.exe a.txt b.txt c.txt
    
    哈利!
    步骤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.exediff.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

    最佳答案

    解决方案是直接使用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')
    

    关于windows - 可执行的merge.exe(从MSYS2中提取)未在Windows上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63290096/

    相关文章:

    python - 如何合并多维数据框和不同长度的系列?

    javascript - go - 在 Go 中合并 RethinkDB

    ios - iOS 的 codename1.ext.codescan cn1lib 有问题

    c - 使用 geany 制作/构建

    windows - 通过 IIS 使用 GIT 智能 HTTP

    Windows cmd批处理文件,复制源文件夹和内容

    java - 连接Java中的多个音频文件

    c++ - 导致非原子撕裂

    windows - 修改文本突出显示如何工作?

    java - 如果激活多个配置文件,如何解决冲突的属性