Как настроить разрешение конфликтов SVN с Meld? - PullRequest
27 голосов
/ 31 августа 2011

Я указал merge-tool-cmd = meld в моей конфигурации Subversion. Когда я иду разрешить конфликт слияния, используя опцию l из представленных опций разрешения конфликтов, я получаю сообщение:

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

Может кто-нибудь диагностировать проблему / предложить решение? Спасибо.

Ответы [ 3 ]

42 голосов
/ 14 сентября 2011

Первое предупреждение!Это очень легко потерять ваши локальные изменения, если вы ошиблись!Тестовый тестовый тест!

Боюсь, скрипт из ссылки pmod не работает с svn 1.6 (текущий в Ubuntu 11.04).Собрав код из ссылки pmod и здесь и совета здесь , я сделал этот скрипт, который, кажется, работает нормально:

#!/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' для разрешения конфликта и скопировать слитую версию в рабочую копию.

9 голосов
/ 26 октября 2013

Ответ drevicko правильный для последних 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.

Вы также можете скачать svn-merge-meld.sh или разветвить его:

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
2 голосов
/ 31 августа 2011

Вам нужно использовать скрипт-обертку, чтобы захватывать и выставлять вещи в порядке, необходимом для вашего инструмента сравнения (отметьте this ):

Ключ к использованию внешнегоДвух- и трехсторонние инструменты различий (конечно, кроме GNU diff и diff3) в Subversion используют скрипты-обертки, которые преобразуют входные данные из Subversion в нечто, понятное вашему инструменту различий, а затем преобразуют результаты вашихинструмент обратно в формат, который ожидает Subversion - формат, который использовали бы инструменты GNU....

Subversion вызывает внешние программы сравнения с параметрами, подходящими для утилиты GNU diff, и ожидает только, что внешняя программа вернется с успешным кодом ошибки.Для большинства альтернативных программ сравнения интересны только шестой и седьмой аргументы - пути к файлам, которые соответственно представляют левую и правую стороны diff.

Это очень хорошо описано здесь

...