Изменение инструмента SVN по умолчанию
После блога я создал командный файл, wm.bat:
"d:\svnroot\external\winmerge\WinMerge.exe" /B /WAIT "d:\svnroot\external\winmerge\WinMergeU.exe" /e /ub /dl %3 /dr %5 %6 %7
И я попробовал позвонить
svn diff | wm
но это не сработало. Итак, как мне интегрировать WinMerge или аналогичную утилиту с svn diff
?
Расширение ответа Дэвида ниже, изменение значения по умолчанию для Windows требует редактирования файла конфигурации, расположенного в (для Windows XP)
C:\Documents and Settings\%USERNAME%\Application Data\Subversion\config
или (Windows Vista)
C:\Users\%USERNAME%\AppData\Roaming\Subversion\config
Ответы
Ответ 1
Хорошо, глядя на исходное сообщение в блоге, это то, что вы хотите:
svn diff --diff-cmd wm [optional-filename]
Если вы хотите увидеть, что на самом деле происходит здесь (например, какие параметры svn diff
передаются номинированному diff-cmd
), вы можете просто использовать svn diff --diff-cmd echo
и посмотреть, что он говорит:
[~/src/gosmore-dev]$ svn diff --diff-cmd echo
Index: gosmore.cpp
===================================================================
-u -L gosmore.cpp (revision 13753) -L gosmore.cpp (working copy) .svn/text-base/gosmore.cpp.svn-base gosmore.cpp
Некоторые цитаты были удалены выше, но в основном вы можете видеть, что svn diff
пройдет
-u -L "<left-label>" -L "<right-label>" <left-file> <right-file>
в ваш пакетный файл. Пакетный файл, который вы используете, используется для преобразования этих команд в формат, который понимает WinMerge.
Подробнее и примеры того, как все это работает, представлены в svn book.
Чтобы сделать ваш пакетный файл по умолчанию для svn diff
, вам нужно добавить следующую строку в разделе [helpers]
в вашем локальном файле конфигурации subversion (~/.subversion/config
в Linux, я не уверен, где находится файл конфигурации находится в Windows) (см. этот ранее вопрос SO)
diff-cmd=wm.bat
Ответ 2
Проверьте эту ссылку:
http://blog.tplus1.com/index.php/2007/08/29/how-to-use-vimdiff-as-the-subversion-diff-tool/
Вот копия для уверенности SOer:
Получите этот файл diffwrap.sh script и сохраните его в любом месте. Я спас свою в своем $ HOME/bin. Обязательно сделайте это исполняемый файл! Im показывает это ниже:
#!/bin/sh
# Configure your favorite diff program here.
DIFF="/usr/bin/vimdiff"
# Subversion provides the paths we need as the sixth and seventh
# parameters.
LEFT="$6"
RIGHT="$7"
# Call the diff command (change the following line to make sense for
# your merge program).
"$DIFF" "$LEFT" "$RIGHT"
# Return an errorcode of 0 if no differences were detected, 1 if some were.
# Any other errorcode will be treated as fatal.
Затем измените файл $HOME/.subversion/config
на то, что script:
[helpers]
diff-cmd = /home/matt/bin/diffwrap.sh
Затем перейдите в файл diff!
Ответ 3
При использовании Cygwin и SVN 1.7 с помощью WinMerge используйте этот командный файл в качестве внешнего инструмента сравнения. Мне пришлось адаптировать http://manual.winmerge.org/CommandLine.html для работы с путями Cygwin.
В .subversion\config
:
[helpers]
diff-cmd = C:\path\to\winmergesvndiff.bat
Содержание winmergesvndiff.bat
@echo off
set left=%6
set right=%7
REM Repeat these two lines for all drives
set left=%left:/cygdrive/c/=c:/%
set right=%right:/cygdrive/c/=c:/%
REM Path to WinMerge may vary
start "WinMerge" /B "C:\program files (x86)\winmerge\WinMergeU.exe" /e /s /ub /dl %3 /dr %5 %left% %right%
Ответ 4
Для Mac::
открыть этот файл: ~/.subversion/config
найти и раскомментировать строку, содержащую: diff-cmd (удалив # из начала)
перед diff-cmd, дайте имя инструмента diff, как в моем случае я использовал инструмент сравнения araxis merge diff, поэтому он выглядел так:
diff-cmd =/Приложения/Araxis Merge.app/Contents/Utilities/araxissvndiff
После этого, когда вы запустите svn diff на терминале, если будет отображаться разность файлов в этом инструменте
убедитесь, что нет места до и после слова diff-cmd.
Ответ 5
После создания командного файла, содержащего вызов вашей любимой программы слияния, вы можете настроить Subversion на всегда использовать командный файл в Windows (без необходимости аргумента -diff-cmd при каждом использовании), изменив строку
# diff-cmd = diff_program (diff, gdiff, etc.)
в файле C:\Documents and Settings\имя_пользователя\Application Data\Subversion\config. Эта строка должна быть изменена, чтобы указать на пакетный файл. Например:
diff-cmd = c:\bin\wm.bat
Ответ 6
Вам нужно преобразовать путь в стиль Windows:
#!/bin/sh
LEFT="$6"
RIGHT="$7"
RRIGHT=`cygpath.exe -pw $RIGHT`
LLEFT=`cygpath.exe -pw $LEFT`
/cygdrive/c/Program\ Files\ \(x86\)/WinMerge/WinMergeU.exe /e /s /ub /dl %3 /dr %5 $LLEFT $RRIGHT
Ответ 7
Meld отлично работает для меня. После установки я перешел в конфигурационный файл Subversion
, раскомментировал строку diff-cmd
и установил ее в путь, когда meld.exe. В моем случае:
[helpers]
### ...
### Set diff-cmd to the absolute path of your 'diff' program.
### This will override the compile-time default, which is to use
### Subversion internal diff implementation.
diff-cmd = D:\SOFT\Meld\meld\meld.exe
Ответ 8
Используя Cygwin, Subversion (версия Cygwin) и WinDiff требует некоторой осторожности, чтобы справиться с последней нетерпимостью косой черты. Я использую следующий Bash script, установленный с помощью параметра svn diff-cmd, чтобы получить желаемые результаты с помощью 'svn diff':
arg1=$(echo $6 | sed 's/\//\\/g' | sed 's/\\cygdrive\\c/c:/')
arg2=$(echo $7 | sed 's/\//\\/g' | sed 's/\\cygdrive\\c/c:/')
cmd /c windiff.exe $arg1 $arg2
Ответ 9
У меня было 3 проблемы с простым .bat файлом, особенно если версия не соответствовала версии в рабочем каталоге:
- svn может записывать файлы, которые будут сравниваться с временным каталогом, а затем удалять их, прежде чем WinMerge сможет просмотреть их.
- svn может взять файл из подкаталога .svn\pristine, где его имя файла - длинная строка шестнадцатеричных цифр
- WinMerge основывает выделение синтаксиса на расширениях файлов и когда svn использует временный файл, он не имеет расширения
Итак, я закончил загрузку небольшого PowerShell в файл .bat, чтобы обойти эти проблемы:
;@echo off
;set leftdesc=%~3
;set rightdesc=%~5
;set leftfile=%~6
;set rightfile=%~7
;Findstr -rbv ; %0 | powershell -c -
;goto:sCode
&{
$leftExt, $rightExt = ($env:leftdesc, $env:rightdesc) -replace '.*([.]\w+).*','$1'
if ($env:leftfile.EndsWith($leftExt)){
$leftFile = $env:leftfile
}else{
$leftFile = Join-Path $env:temp ((Split-Path $env:leftfile -Leaf) + $leftExt)
Copy-Item $env:leftfile $leftFile -Force
}
if ($env:rightfile.EndsWith($rightExt)){
$rightFile = $env:rightfile
}else{
$rightFile = Join-Path $env:temp ((Split-Path $env:rightfile -Leaf) + $rightExt)
Copy-Item $env:rightfile $rightFile -Force
}
$descriptions = '/dl "' + $env:leftdesc + '" /dr "' + $env:rightdesc + '"'
$fileNames = '"' + $leftFile + '" "' + $rightFile + '"'
start 'C:\Program Files (x86)\WinMerge\WinMergeU.exe' ('/e /u ' +$descriptions + ' ' + $fileNames)
}
;:sCode
;goto :eof
Благодаря Walid Toumi для обертки.
Ответ 10
Что-то похожее на приведенные выше ответы работало для меня, но для моей конкретной установки требовалась небольшая настройка. Модификации для меня были необходимы, чтобы (1) учесть каталог "/tmp" в Cygwin и (2) обеспечить, чтобы файл "/tmp" оставался присутствующим (отсюда "начало" исчезло из запуска Meld).
Ниже .bat файл работал у меня:
- Cygwin (x64)
- SVN (командная строка)
- Meld
- Windows 10
-
@echo off
set left=%6
set right=%7
REM Repeat these two lines for all drives
set left=%left:/cygdrive/d/=d:/%
set right=%right:/cygdrive/d/=d:/%
set left=%left:/tmp=c:/cygwin64/tmp%
set right=%right:/tmp=c:/cygwin64/tmp%
"C:\program files (x86)\meld\Meld.exe" %left% %right%