【问题标题】:How to set up svn conflict resolution with meld?如何使用 meld 设置 svn 冲突解决方案?
【发布时间】:2011-11-07 07:07:44
【问题描述】:

我在我的 Subversion 配置中指定了 merge-tool-cmd = meld。当我使用提供的冲突解决选项中的选项 l 解决合并冲突时,我收到消息:

meld: error: too many arguments (wanted 0-4, got 5)
The external merge tool exited with exit code 2

任何人都可以诊断问题/提供解决方案吗?谢谢。

【问题讨论】:

    标签: svn meld


    【解决方案1】:

    首先警告!如果您弄错了,很容易最终丢失本地编辑!测试测试测试!

    恐怕 pmod 链接中的脚本不适用于 svn 1.6(当前在 Ubuntu 11.04 中)。将来自pmod's linkhere 的代码和建议here 放在一起,我制作了这个似乎可以正常工作的脚本:

    #!/usr/bin/env python
    # svn merge-tool python wrapper for meld
    import sys
    import subprocess
    
    try:
       # path to meld
       meld = "/usr/bin/meld"
    
       # file paths
       base   = sys.argv[1]
       theirs = sys.argv[2]
       mine   = sys.argv[3]
       merged = sys.argv[4]
    
       # the call to meld
       # For older meld versions:
       # cmd = [meld, mine, base, theirs, merged]
       # New meld versions: >= 1.8.4
       cmd = [meld, mine, base, theirs, '-o', merged]
    
       # Call meld, making sure it exits correctly
       subprocess.check_call(cmd)
    except:
       print "Oh noes, an error!"
       sys.exit(-1)
    

    将其保存在合理的地方(例如/usr/local/bin/svn-merge-meld.py)并使其可执行:

    sudo chmod +x /usr/local/bin/svn-merge-meld.py
    

    然后编辑~/.subversion/config 并取消注释merge-tool-cmd = 行,并将路径设置为您的命令。

    请注意,当发生冲突时,系统会提示您如何处理。您需要输入一个 l 并让 svn 运行此脚本。完成合并后,您需要输入 r 来解决冲突并将合并后的版本复制到工作副本。

    【讨论】:

    • 删除 os 和 shutil 导入——它们不再使用了。
    • 似乎meld的调用cmd已经改变——我使用cmd = [meld, mine, base, theirs, '-o', merged](meld 1.8.4)。 `
    • 用那个 catch 扔掉错误信息不是很有用。
    • 很好的答案。我之前投票过,然后现在已经第二次回来了(解决svn冲突的需要再次出现..)并想再次投票:)
    【解决方案2】:

    drevicko's answer 适用于最近的meld 版本。但也使用较旧的meld 版本:

    下面的bash 脚本svn-merge-meld.sh 支持旧的和最近的meld 版本(四个参数中的三个)。

    #!/bin/bash
    
    base=${1?1st argument is 'base' file}
    theirs=${2?2nd argument is 'theirs' file}
    mine=${3?3rd argument is 'mine' file}
    merged=${4?4th argument is 'merged' file}
    version=$(meld --version | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/' )    
    
    if [[ "$version" < 1.7 ]]
    then
      #old meld version 1.6.* = three input files
      cat "$mine" > "$merged"
      meld --label="Base=${base##*/}"           "$base"   \
           --label="Mine->Merged=${merged##*/}" "$merged" \
           --label="Theirs=${theirs##*/}"       "$theirs"
    else
      # recent meld versions 1.7.* and above = four input files
      meld --label="Base=${base##*/}"           "$base"   \
           --label="Mine=${mine##*/}"           "$mine"   \
           --label="Merged=${merged##*/}"       "$merged" \
           --label="Theirs=${theirs##*/}"       "$theirs"
    fi
    

    别忘了chmod +x svn-merge-meld.sh

    您也可以download svn-merge-meld.sh 或 fork :

    git clone github.com/olibre/svn-useful-scripts.git
    

    最后,更新您的 配置:

    vi ~/.subversion/config
    

    并启用merge-tool-cmd:

    [helpers]
    merge-tool-cmd = /home/....../svn-useful-scripts/svn-merge-meld.sh
    

    【讨论】:

    • meld 3.18.0 只需要 3 个参数。如何支持?
    【解决方案3】:

    您需要使用包装脚本来抓取和放置颠覆工具所需的东西(检查this):

    使用外部二路和三路差分工具(其他 当然,与 GNU diff 和 diff3 相比)使用 Subversion 是使用包装脚本,它 将 Subversion 的输入转换为您的 差分工具可以理解,然后将输出转换为 你的工具恢复为 Subversion 期望的格式—— GNU 工具会使用。 ...

    Subversion 使用适合的参数调用外部差异程序 GNU diff 实用程序,并且只期望外部程序将 返回成功的错误代码。对于大多数替代差异 程序,只有第六和第七个参数——文件的路径 分别代表差异的左侧和右侧 - 是 感兴趣。

    这个描述得很好here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-14
      • 2010-09-11
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 2022-10-14
      • 1970-01-01
      相关资源
      最近更新 更多