使用 Windows、Mercurial 和 extdiff 扩展(用于 Mercurial)。我试图设置 extdiff 以将 WinDiff 用作外部差异工具,但我认为我已经缩小了问题的范围,足以说明问题是在我到达那一步之前。
据我对 extdiff 的了解,它只是调用您的 cmd.winmerge 程序,并将必要的目录传递给它。我也在处理此处概述的一些假设(可能准确也可能不准确;我只是在学习 Mercurial):
上面写着:
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 在继续之前似乎没有更改到临时目录,因为它似乎应该在上面的步骤 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 在其中创建临时文件的 extdiff.xxxxx\子目录。
总结::-(
编辑:将批处理文件更改为
@echo off
echo %cd%\extdiff*
echo %1
echo %2
D:\Documents\apps\WinMergePortable\App\WinMerge\WinMergeU.exe %1 %2
似乎使它工作(注意更改了第二行),但它似乎仍然是一个令人讨厌的 hack,而不是它应该如何工作。 :-\
编辑:这是我的 Mercurial.ini 文件:
[ui]
username = Tim Skoch <my_real@email.address>
editor = D:\Documents\apps\Notepad++\notepad++.exe -multiInst
[extensions]
hgext.graphlog =
hgext.extdiff =
[extdiff]
cmd.winmerge = d:\Documents\apps\mercurial\diff_winmerge.bat
最佳答案
我可以确认 extdiff
将 在启动 diff 程序之前更改为临时目录。您可以使用 --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“无法正确找到文件”。有other questions and answers on SO关于 WinMerge,他们似乎让它工作得很好。也许您可以尝试他们的命令行选项。
关于windows - Mercurial/extdiff 没有更改为临时目录(正如我认为的那样),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3293223/