26

我正在尝试使用 git 的新(从 gi​​t 1.7.11 开始)目录 diff 命令,并将 Beyond Compare 3 作为 difftool,但没有创建临时文件。

例如:

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

4 回答 4

30

这里描述了一个解决方案。基本上,如果您修改 .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"
于 2012-11-30T00:31:05.960 回答
5

Scott Wegner 的回答有一个小缺点 - 如果您尝试同时运行 2 个比较,第二个将不起作用。这是因为 BCompare.exe 不运行第二个应用程序实例,因此过早关闭启动的进程。

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

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
于 2017-02-27T08:12:34.907 回答
5

我尝试了@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

With this option, I run start git difftool --dir-diff, so this will free up my command prompt, and a new prompt will continue waiting for the new instance of Beyond Compare to exit. This will also make sure that the temp files/folders created by git will continue to live till the diff tool exits.

于 2018-09-04T18:15:02.010 回答
3

请注意,您还有另一种git difftool --dir-diff可能行为不端的情况。

" git difftool --dir-diff" 从子目录开始时有轻微的回归,该子目录已在 Git 2.12(2017 年第一季度)中修复。

请参阅David Aguilar ( )的提交 853e10c(2016 年 12 月 7 日) 。(由Junio C Hamano 合并——提交 afe0e2a中,2016 年 12 月 19 日)davvid
gitster

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

9ec26e7(difftool:修复子目录中的参数处理,2016-07-18,Git 2.9.3)更正了路径参数在子目录中的处理方式,但它在子目录之外的条目如何处理方面引入了回归dir-diff

在准备差异的右侧时,我们只在临时区域中包含更改的路径。
diff 的左侧是从一个临时索引构造的,该索引是从同一组更改的文件中构造的,但它是从子目录中构造的。
这是一个问题,因为索引路径是相对于顶层的,因此它们没有被添加到索引中。

在准备其临时索引之前,教difftoolchdir存储库的顶层。
这确保了所有顶级相对路径都是有效的。

于 2016-12-23T23:15:13.117 回答