为webstorm配置外部git diff工具

时间:2015-02-16 11:25:16

标签: git

我尝试将webstorm配置为外部差异工具。 Webstorm接受两个参数,这两个参数应该是可比文件的路径,所以如果我运行以下内容:

webstorm diff E/repo/file1.txt E/repo/file2.txt

一切正常。现在我尝试将配置放入config:

[diff]
    external = webstorm diff $LOCAL $REMOTE

我试图回复$LOCAL$REMOTE参数并且它们似乎包含由git创建的临时文件的完整路径,因此一切都应该正常工作,但是当我运行时

git diff master feature

webstorm正在启动,但后来我收到以下消息external diff died, stopping at file.txt.我做错了什么?

我还发现了其他几种解决方案: the first one建议如下:

diff $(cd $(dirname $LOCAL) && pwd)/$(basename $LOCAL) $(cd $(dirname $REMOTE) && pwd)/$(basename $REMOTE)

但我得到以下输出:

dirname: too few arguments
Try `dirname --help' for more information.
basename: too few arguments
Try `basename --help' for more information.
dirname: too few arguments
Try `dirname --help' for more information.
basename: too few arguments
Try `basename --help' for more information.

webstorm也会在没有比较的情况下退出。这个配置尝试做什么?

$(cd $(dirname $LOCAL) && pwd)/$(basename $LOCAL)

下一个解决方案来自git manual: 它建议我创建包装脚本:

  

diff包装器检查以确保提供七个参数   将其中两个传递给您的合并脚本。默认情况下,Git通过了   以下是diff程序的参数:

path old-file old-hex old-mode new-file new-hex new-mode
  

因为您只需要旧文件和新文件参数,所以使用包装器   脚本传递你需要的脚本。

$ cat /usr/local/bin/extDiff 
#!/bin/sh
[ $# -eq 7 ] && /usr/local/bin/extMerge "$2" "$5"

我还没有对这个进行过测试,但我会理解为什么之前的两个不起作用。

2 个答案:

答案 0 :(得分:2)

在原始问题中回答我自己的问题:

  

我尝试将配置放入配置中......但它失败了:

[diff]
    external = webstorm diff $LOCAL $REMOTE

diff.external 仅接受要启动的程序名称。它启动了这个程序并传递了7个参数。 $LOCAL配置设置的上下文中没有$REMOTEdiff.external个变量。这就是它失败的原因。

  

下一个解决方案来自git手册:它建议我创建   包装脚本

由于diff.external不仅仅接受程序名称,因此我们需要找到一种方法来过滤掉这7个参数,并且只需要两个webstorm所需的参数。这就是为什么我们需要这个包装脚本来过滤掉这些参数并只用两个启动webstorm。

所以我现在使用的配置是:

[diff]
    tool = webstorm
[difftool]  
    prompt = false
[difftool "webstorm"]
    cmd = webstorm diff $PWD/$REMOTE $LOCAL
    trustExitCode = false
difftool块中的

cmd指定从命令行执行git difftool -t "webstorm"时要运行的命令。所以它会运行webstorm diff $PWD/$REMOTE $LOCAL。请注意,$REMOTE$LOCAL变量可用于difftool.cmd块内。在我的情况下,$REMOTE变量保存相对于当前目录的文件路径,即只是file1.txt,而$LOCAL具有完整路径,即E:/temp/file1.txt(由$PWD创建的临时文件git进行比较)。由于webstorm需要完整路径,因此我添加$REMOTE变量,该变量具有当前目录的路径并将其与$PWD/$REMOTE合并。我得到完整路径:E:/myrepo/file.txt - -t。最后,我使用gitdiff上面的git选项明确指定要使用的diff工具的配置。如果您希望difftool使用某些默认diff.tool配置,请在{{1}}配置变量中指定它(在我的情况下它是如何完成的)。

答案 1 :(得分:0)

在配置中,您编写了diff这个词,它似乎是多余的。请尝试改为:

external = webstorm $LOCAL $GLOBAL