git difftool --dir-diff未创建临时文件供Beyond Compare 3使用

28

我尝试使用git的新功能(自git 1.7.11起)——目录比较命令与Beyond Compare 3作为对比工具,但是暂时文件没有被创建。

例如:

git difftool --dir-diff <branch1> <branch2>

Beyond Compare会打开一个目录比较窗口,并列出正确的目录和更改的文件。

然而,当我点击任何一个文件时,我会得到以下错误信息:

Unable to load C:\Users\<username>\AppData\Local\Temp\git-difftool.yG8V5\left\<path to some file>: The system cannot find the path specified

所以,我检查了C:\Users\<username>\AppData\Local\Temp\git-difftool.yG8V5目录是否存在,但它并不存在。

Beyond Compare 3在非目录比较和合并时正常工作。

我正在使用git for Windows (msysgit) 1.8.0。

以下是相关的.gitconfig设置:

# External Visual Diff/Merge Tool
[diff]
    tool = bc3

[difftool "bc3"]
    path = "C:/Program Files (x86)/Beyond Compare 3/BComp.exe"

[merge]
    tool = bc3

[mergetool "bc3"]
    keepTemporaries = false
    trustExitCode = true
    keepBackup = false
    path = "C:/Program Files (x86)/Beyond Compare 3/BComp.exe"

4
问题似乎在于Beyond Compare在使用--dir-diff标志启动时没有保持控制台会话(BComp.exe)打开,因此Git会在BC读取它之前删除临时目录。 根据【BeyondCompare命令行参考】(http://www.scootersoftware.com/help/index.html?command_line_reference.html),当从版本控制系统启动时,BComp.exe具有特殊的行为。 我怀疑它用于推断的任何内容都无法使用此标志。 - Scott Wegner
4个回答

31

这里描述了一个解决方案基本上,如果您修改.gitconfig以使用BCompare.exe而不是BComp.exe,控制台会话将保持打开状态,直到关闭Beyond Compare窗口。

修改您的.gitconfig设置以读取:

# External Visual Diff/Merge Tool
[diff]
    tool = bc3

[difftool "bc3"]
    path = "C:/Program Files (x86)/Beyond Compare 3/BCompare.exe"

2
这对我有效。然而,Beyond Compare 网站上的说明是错误的。 - Frank
这对我无效(“未知工具”)。所以,我使用cmd = C:/path/to/bcompare.exe \"$LOCAL\" \"$REMOTE\"代替了path = ...,现在它可以工作了。 - Marc

6

Scott Wegner的答案有一个小缺陷 - 如果您尝试同时运行两个比较,第二个将不起作用。这是因为BCompare.exe不会运行第二个应用程序实例,导致启动的进程关闭得太早。

遗憾的是,BCompare.exe不理解/solo命令行选项,因此我在Beyond Compare 3安装目录中编写了一个小批处理文件:

C:\ Program Files(x86)\ Beyond Compare 3 \ BCompD.bat

start /wait "" "%~dp0/bcomp.exe" %* /solo

并将其用作工具

[difftool "bc3dir"]
    path = C:/Program Files (x86)/Beyond Compare 3/bcompd.bat
    cmd = \"C:/Program Files (x86)/Beyond Compare 3/bcompd.bat\" \"$LOCAL\" \"$REMOTE\"

我不使用这个作为默认的diff tol,所以我将其命名为bc3dir并像下面这样使用:

git difftool --dir-diff --tool=bc3dir 760be6d47d35b42a6a2409636b40a5521361e72f^ 760be6d47d35b42a6a2409636b40a5521361e72f

很好的BC包装器。+1 - VonC
“bcompare.exe /solo”选项在BC 3.1.9中可以正常使用,因此不必使用批处理文件。要将其与“git difftool”集成,我必须将其用作“-solo”,因为否则“sh.exe”会将其解释为路径。 - Vikhram

6

我尝试了@ScottWegner的方法,但仅在Beyond Compare未启动时才有效。在@SergeyAzarkevich的帮助下,我找到了解决方案。这是我在.gitconfig中所做的:

[diff]
    tool = bc3
[difftool]
    prompt = false
[difftool "bc3"]
    cmd = \"c:/program files (x86)/beyond compare 3/bcompare.exe\" -solo \"$LOCAL\" \"$REMOTE\"

注意-solo。这会导致Beyond Compare启动一个新的程序实例。
在Windows上,我们应该使用/solo选项,但由于git difftool命令会生成sh.exe来处理其命令行,因此/solo选项被错误地解释为路径。因此,我必须使用它作为-solo
使用这个选项,我运行start git difftool --dir-diff,这样就可以释放我的命令提示符,一个新的提示符将继续等待Beyond Compare的新实例退出。这也确保了git创建的临时文件/文件夹将继续存在,直到差异工具退出。

3
请注意,您有另一种情况可能会导致git difftool --dir-diff行为异常。
"git difftool --dir-diff"在从子目录启动时出现了轻微的回归,这已经在Git 2.12(2017年第一季度)中得以解决。
请参见提交853e10c(由David Aguilar (davvid)于2016年12月07日进行)。
(由Junio C Hamano -- gitster --合并到提交afe0e2a,2016年12月19日)

difftool:修复在子目录中创建dir-diff索引的问题

9ec26e7(difftool:修复子目录中的参数处理,2016-07-18,Git 2.9.3)纠正了在子目录中处理路径参数的方式,但是它在dir-diff处理子目录外的条目时引入了一个回归问题。

在准备差异的右侧时,我们只在临时区域中包括更改的路径。
差异的左侧从一个临时索引构建,该索引是从相同的更改文件集构建的,但是它是从子目录内部构建的。
这是一个问题,因为索引的路径是顶级相关的,因此它们没有被添加到索引中。

difftool在准备其临时索引之前切换到存储库的顶层。
这确保了所有顶级相关路径都是有效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接