Подтвердить что ты не робот

Как настроить разрешение svn-конфликтов с помощью meld?

Я указал 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

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

4b9b3361

Ответ 1

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

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

#!/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 запустить этот script. Когда вы закончите слияние, вам нужно ввести "r", чтобы разрешить конфликт и скопировать объединенную версию в рабочую копию.

Ответ 2

drevicko answer подходит для последних версий meld. Но более старые версии meld также используются:

Ниже bash script 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

Наконец, обновите svn

vi ~/.subversion/config

и включите merge-tool-cmd:

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

Ответ 3

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

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

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

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