更改默认SVN差异工具

时间:2009-02-20 11:43:00

标签: svn diff

在博客之后,我创建了一个批处理文件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集成?

根据David的回答,更改Windows的默认值需要编辑位于(适用于Windows XP)的配置文件

C:\Documents and Settings\%USERNAME%\Application Data\Subversion\config

或(Windows Vista)

C:\Users\%USERNAME%\AppData\Roaming\Subversion\config

10 个答案:

答案 0 :(得分:30)

好的,看看original blog post,这就是你想要的:

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的默认文件,您需要在本地subversion配置文件的[helpers]部分添加以下行(Linux中为~/.subversion/config,我是不确定配置文件在Windows中的位置)(请参阅此earlier SO question

diff-cmd=wm.bat

答案 1 :(得分:8)

点击此链接:

http://blog.tplus1.com/index.php/2007/08/29/how-to-use-vimdiff-as-the-subversion-diff-tool/

以下是SOer方便的副本:

  
    

获取此diffwrap.sh脚本并将其保存在任何位置。我救了我的     $ HOME / bin目录。一定要做     它可执行!我在下面显示:

  
#!/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文件更改为指向该脚本:

[helpers]
diff-cmd = /home/matt/bin/diffwrap.sh
     

然后去差异文件!

答案 2 :(得分:3)

在WinMerge中使用Cygwin和SVN 1.7时,请使用此批处理文件作为外部差异工具。我不得不调整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%

答案 3 :(得分:3)

对于Mac ::

打开此文件:〜/ .subversion / config

查找并取消注释包含以下内容的行:diff-cmd(通过从开头删除#)

在diff-cmd前面的

,给出diff工具的名称,就像在我的情况下我使用的是araxis merge diff工具,所以它看起来像这样:

diff-cmd = / Applications / Araxis Merge.app/Contents/Utilities/araxissvndiff

此后每当你在终端上运行svn diff时,if会显示该工具中文件的差异

确保diff-cmd word之前和之后没有空格。

答案 4 :(得分:2)

创建包含对您喜欢的合并程序的调用的批处理文件后,您可以将Subversion配置为始终在Windows中使用批处理文件(每次使用时不需要--diff-cmd参数),方法是修改行

# diff-cmd = diff_program (diff, gdiff, etc.)

在文件C:\ Documents and Settings \ username \ Application Data \ Subversion \ config中。应将此行更改为指向批处理文件。例如:

diff-cmd = c:\bin\wm.bat

答案 5 :(得分:2)

您需要将路径转换为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

答案 6 :(得分:2)

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's internal diff implementation.
diff-cmd = D:\SOFT\Meld\meld\meld.exe

答案 7 :(得分:0)

使用Cygwin,Subversion(Cygwin的版本)和WinDiff需要一些小心处理后者对正斜杠的不容忍。我使用以下Bash脚本,通过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

答案 8 :(得分:0)

我在简单的.bat文件中遇到了3个问题,特别是当修订版与工作目录中的版本不匹配时:

  • 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

答案 9 :(得分:0)

类似于上述答案的东西对我有用,但是,我的特殊设置需要一些自定义。需要对我进行修改以便(1)考虑&#34; / tmp&#34; Cygwin中的目录,以及(2)确保&#34; / tmp&#34;文件保持存在(因此&#34;开始&#34;从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%
相关问题