【问题标题】:Msys Git Merge Tool Command Options IssueMsys Git 合并工具命令选项问题
【发布时间】:2010-10-12 18:48:18
【问题描述】:

我在 Windows 机器上使用 msys Git 进行源代码控制,我正在尝试弄清楚如何让我的合并工具 WinMerge 与 Git 一起使用。

我已尽我所能关注the instructions on this blog,因为这是我发现的最接近我正在尝试做的事情。基本上我所做的是:

修改我的.gitconfig 文件以包含以下内容:

[合并] 工具 = winmerge [合并工具“winmerge”] cmd = \"C:\\Program Files (x86)\\WinMerge\\WinMergeU.exe\" "$PWD/$LOCAL" "$PWD/$REMOTE" "$PWD/$MERGED" 信任退出代码 = 假 保持备份 = 假

这几乎可以工作了。当我尝试从 Git 运行合并工具时,WinMerge 给我一个错误,说它找不到文件的路径,这是完全有道理的,因为它正在寻找的路径是:

C:\MY\WORKING\DIRECTORY\-e C:\MY\WORKING\DIRECTORY\-ub

看起来 Git 正在将选项传递给合并工具,而不是我希望在一切正常的情况下传递的本地和远程文件名。

我在网上搜索了 Git 的合并文档,但似乎找不到与我正在尝试做的事情相关的任何内容。我的猜测是解决方案将是以下之一:

  1. 假设$LOCAL$REMOTE 不正确,将$LOCAL$REMOTE 变量更改为正确的值。
  2. 编写一个.bat 脚本来调用WinMergeU,并在我的.bat 脚本的逻辑中处理Git 发送到合并工具的参数。

【问题讨论】:

    标签: git version-control merge batch-file


    【解决方案1】:

    来自WinMerge Command line manual

    cmd = \"C:\\Program Files (x86)\\WinMerge\\WinMergeU.exe /ub /e \"
    cmd = \"C:\\Program Files (x86)\\WinMerge\\WinMergeU.exe /u /e \"
    

    (/u 是带有最新 WinMerge 的新 /ub)

    作为合并工具部分中的命令可能会更好。

    但是,您可能必须将此调用包装在脚本中,如 SO answer 中所述。

    提取适应merge.tool:

    使用自定义diff 工具配置mergetool 的实际案例:

    C:\myGitRepo>git config --global merge.tool winmerge
    C:\myGitRepo>git config --global mergetool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
    C:\myGitRepo>git config --global mergetool.prompt false
    

    winmerge.sh 存储在PATH 的目录部分中:

    #!/bin/sh
    echo Launching WinMergeU.exe: $1 $2
    "C:/Program Files/WinMerge/WinMergeU.exe" -e -ub "$1" "$2"
    

    如果您有其他工具(kdiff3P4Diff、...),请创建另一个 shell 脚本和相应的 mergetool.myMergeTool.cmd 配置指令。
    然后您可以使用merge.tool 配置轻松切换工具。

    【讨论】:

    • +1。 (如果可以的话。但至少我可以撤消我的否决... 似乎是 bug)实际上,如果您将 winmerge 添加到您的路径(或设置 mergetool.winmerge.path 我猜)不需要脚本
    • 顺便说一下,这个问题应该是mergetool,而不是difftool
    • @Tobias:谢谢。答案已更新(difftool 替换为 mergetool
    • 如果您使用的是 x64 Windows,则将 (x86) 添加到路径。尝试添加编辑以显示 .gitconfig 文件的外观,如果您对其进行编辑而不是使用 git config --global 三次。 .gitconfig 中的关键行:在[merge] 下(如果不存在,则添加括号部分)添加tool = winmerge 并在[mergetool "winmerge"] 下添加cmd = "wmDiff.sh \"$LOCAL\" \"$REMOTE\"" 然后trustExitCode = false 然后keepBackup = false。同样在[mergetool](后面没有“winmerge”;新部分)下是prompt = false。发现编辑 .gitconfig 更容易测试/优化选项。
    【解决方案2】:
    [mergetool "winmerge"]
        cmd = winmergeu -e -ub -wl -dl "Remote" -dr "Local" "$PWD/$REMOTE" "$PWD/$LOCAL" "$PWD/$MERGED"
        keepBackup = false
    

    如果您查看C:\Program Files\Git\share\git-gui\lib\mergetool.tcl 内部,它具有常用合并工具的语法。

    我仍在试图弄清楚如何直接从 Git GUI 调用 mergetool...

    【讨论】:

      【解决方案3】:

      如果您查看有冲突的文件,您会注意到标准的 Theirs >>>>>>><<<<<< Mine 标记。 WinMerge 将这些理解为合并冲突,因此不需要明确指定“他们的”和“我的”;只需要告诉它是哪个文件有冲突标记。

      1. 我们知道工作目录中的文件包含标记。
      2. 我们要合并到的文件也将是这个文件是有道理的 - 我们也知道git mergetool 使$MERGED 变量可用于命名该文件。

        [mergetool "winmerge"]
            cmd = 'C:/Program Files/WinMerge/WinMergeU.exe' \"$MERGED\"
        

      这就是将 git 与 WinMerge 连接起来以解决合并/冲突所需的全部内容;不需要脚本或命令行开关。请参阅文档中的第 3 个命令行形式(由上面的 OP 链接)和 conflictfile 参数的解释。

      【讨论】:

      • 没有正确的路径?来自 WinMerge 文档conflictfile Specifies a conflict file, typically generated by a Version control system. The conflict file opens in the File Compare window, where you can merge and resolve conflicts, as described in Resolving conflict files. Note that no other paths can be used with a conflict file.(请原谅蹩脚的引用)也许您没有使用最新版本,您只需要指定一个文件
      • 很高兴能帮上忙...你投票了吗,哈哈?我可以大声问这个吗?
      • 将此添加到我的主文件夹(Windows 上的 C:\Users\username\)中的 .gitconfig 中,然后开始比赛!谢谢。
      猜你喜欢
      • 2021-01-21
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 2011-05-03
      • 2021-11-27
      相关资源
      最近更新 更多