web-dev-qa-db-ja.com

meldでsvn競合解決を設定するにはどうすればよいですか?

私は自分の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

誰かが問題を診断/解決策を提供できますか?ありがとう。

28
Joffer

最初に警告!これを間違えた場合、ローカルの編集内容が失われることは非常に簡単です。テストテストテスト!

Pmodのリンクからのスクリプトがsvn 1.6(Ubuntu 11.04で現在)で動作しないと思います。 pmodのリンクhere からのコードとアドバイス 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」を入力して競合を解決し、マージされたバージョンを作業コピーにコピーする必要があります。

42
drevicko

drevicko's answer は、最近のmeldバージョンでは正しいです。ただし、古いmeldバージョンも使用されます。

以下のbashスクリプトsvn-merge-meld.shは、古いバージョンと最近のmeldバージョンの両方をサポートします(4つの引数のうち3つ)。

#!/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

ダウンロードsvn-merge-meld.sh またはフォーク:

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

最後に、 svn 構成を更新します。

vi ~/.Subversion/config

merge-tool-cmd

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

ラッパースクリプトを使用して、Subversionが差分ツールに必要な順序で取得および配置できるようにする必要があります( this を確認してください)。

Subversionで外部の2方向および3方向の差分ツール(GNU diffとdiff3以外はもちろん)を使用する)の鍵は、Subversionからの入力を何かに変換するラッパースクリプトを使用することです差分ツールが理解でき、ツールの出力をSubversionが期待する形式(GNUツールが使用していた形式)に変換し直す...

Subversionは、GNU diffユーティリティーに適したパラメーターを使用して外部diffプログラムを呼び出し、外部プログラムが正常なエラーコードを返すことのみを期待します。ほとんどの代替diffプログラムでは、6番目と7番目の引数のみ—diffの左側と右側をそれぞれ表すファイルのパスが重要です。

これは非常によく説明されています ここ

2
pmod