Как настроить разрешение 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
Может ли кто-нибудь диагностировать проблему/предоставить решение? Спасибо.
Ответы
Ответ 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, и ожидает только, что внешняя программа будет вернуться с успешным кодом ошибки. Для большинства альтернативных вариантов программ, только шестой и седьмой аргументы - пути файлов которые представляют собой левую и правую части дифференциала соответственно, являются.
Это очень хорошо описано здесь