使用Windows,Mercurial和extdiff扩展名(适用于Mercurial)。我试图设置extdiff以将WinDiff用作外部diff工具,但是我认为我已经缩小了问题的范围,可以说问题出在我还没解决之前。

据我对extdiff的了解,它仅调用cmd.winmerge程序,并将必要的目录传递给它。我还在根据这里概述的一些假设(可能正确也可能不正确;我只是在学习Mercurial)进行工作:

http://bitbucket.org/tortoisehg/stable/issue/457/multiple-extdiff-threads-in-one-process-causes-side#comment-36216

其中说:

The extdiff (visual diff) extension works like this:

1-Generate temporary directory(ies) for older changesets
2-run util.system( cwd=tempdir, "yourdiff tool dir1 dir2" )
    util.system does:
        2.1 store cwd;
        2.2 cd tempdir
3-run your diff tool, wait for it to exit
4-cd oldcwd
5-Then finally extdiff deletes the temp directories.

我遇到的麻烦是,extdiff在继续进行之前似乎并没有切换到temp目录,因为它似乎应该在上面的步骤2.1中进行。

为了找出问题所在,我编写了一个批处理文件,目的只是为了查看CD的内容,传递的内容以及传递的准确程度。批处理文件如下:
@echo off
echo %cd%
echo %1
echo %2
D:\Documents\apps\WinMergePortable\App\WinMerge\WinMergeU.exe %1 %2

然后,我将extdiff设置为将此批处理文件用作extdiff程序。这可行,但是我看到当它回显%cd%时,它只是c:\,而不是预期的c:\temp。我已经验证extdiff在适当的临时目录中创建了临时文件(如上面的步骤1所述;类似于c:\temp\extdiff.xxxxxx\someFolder.someChangesetID\file.ext),所以我知道查看这些目录。在调用WinMerge之前,它只是没有正确地更改为它们,因此,当WinMerge打开时,它看不到临时文件(因为它不在正确的工作目录中)。

基本上,这就是我遇到的问题。我不知道从这里还能去哪里。我想到了
cd %tmp%

在我的批处理文件中,但这仍然无法获取extdiff.xxxxx\子目录,而extdiff在其中创建临时文件。

总之: :-(

编辑:将批处理文件更改为
@echo off
echo %cd%\extdiff*
echo %1
echo %2
D:\Documents\apps\WinMergePortable\App\WinMerge\WinMergeU.exe %1 %2

似乎可以使其工作(请注意第二行已更改),但它似乎仍然令人讨厌,而不是应如何工作。 :-\

编辑:这是我的Mercurial.ini文件:
[ui]
username = Tim Skoch <[email protected]>
editor = D:\Documents\apps\Notepad++\notepad++.exe -multiInst

[extensions]
hgext.graphlog =
hgext.extdiff =

[extdiff]
cmd.winmerge = d:\Documents\apps\mercurial\diff_winmerge.bat

最佳答案

在启动差异程序之前,我可以确认extdiff 更改为临时目录。您可以使用--debug看到这一点。在这里,我使用true作为diff程序(它立即存在):

$ hg extdiff -p true --debug
making snapshot of 2 files from rev 18480437f81b
  a
  b
making snapshot of 2 files from working directory
  a
  b
running "'true'  'foo.18480437f81b' 'foo'" in /tmp/extdiff.IJ9clg
cleaning up temp directory

diff程序的两个参数是目录:旧版本的快照目录和新版本的快照目录。它们在/tmp/extdiff.IJ9clg临时目录中。

令人困惑的一点是,diff程序的参数根据修改文件的数量而不同。仅需一个修改的文件,就无需创建一个
工作副本的快照。因此,如果a是唯一的修改文件,您将看到
$ hg extdiff -p true --debug
making snapshot of 1 files from rev 18480437f81b
  a
running "'true'  '/tmp/extdiff.mUlnP_/foo.18480437f81b/a' '/home/mg/tmp/foo/a'"
in /tmp/extdiff.mUlnP_
cleaning up temp directory

在这里,diff程序以两个文件作为参数启动。如hg help -e extdiff中所述,您可以使用一些变量来构建命令行。默认对应于$parent $child

您说WinMerge“无法正确找到文件”。关于WinMerge的other questions and answers on SO似乎很正常。也许您可以尝试使用其命令行选项。

08-27 18:21