如何在Windows 10 Ubuntu Bash(WSL)上使用difftool和mergetool

15

我使用 Windows Subsystem for Linux 提供的 Windows 10 Ubuntu bash。我想为 git 使用一种可视化的 diff/merge 工具。我在 Windows 上安装了 p4merge(遵循这篇 文章),并以以下方式配置了 git 的 .gitconfig 文件(我调整了路径以便从 Windows 10 Ubuntu bash 访问):

[merge]
    tool = p4merge
[mergetool "p4merge"]
    path = /mnt/c/Program Files/Perforce/p4merge.exe
[mergetool]
    prompt = false
[diff]
    tool = p4merge
[difftool "p4merge"]
    path = /mnt/c/Program Files/Perforce/p4merge.exe
[difftool]
    prompt = false

此外,我已将以下文件夹添加到 .bashrc 中的 bash PATH 变量中,以便可以从任何地方调用它:

 export PATH=$PATH:"/mnt/c/Program Files/Perforce"

我的问题是,如果我在bash中调用git difftool来使用p4merge查看更改,就会收到以下消息:

  • 在bash中:无法转换当前工作目录。使用C:\Windows\system32
  • 调用之后立即启动p4merge应用程序,但出现以下消息:错误:...指向无效文件

如果我理解正确,这个问题可能源于一个Windows程序(即p4merge)找不到引用Linux文件路径(例如/mnt/c/..)的文件。

有没有办法解决这种问题? (也许这是一个更普遍的问题:从Windows应用程序使用Linux路径。)

无论如何,我不坚持使用p4merge,但需要类似的可视化工具来比较差异并进行合并。

如果您能提供任何信息,我将不胜感激。

4个回答

22

这个问题的解决方法更加简化!

感谢 Windows 10版本1903 更新,现在可以从Windows 10访问Linux子系统。 这更容易了。

只需确保git config --global --list有这些行。 就这么简单!

diff.tool=p4merge
merge.tool=p4merge
difftool.p4merge.cmd=/mnt/c/Program\ Files/Perforce/p4merge.exe "$(wslpath -aw $LOCAL)" "$(wslpath -aw $REMOTE)"
mergetool.p4merge.cmd=/mnt/c/Program\ Files/Perforce/p4merge.exe "$(wslpath -aw $BASE)" "$(wslpath -aw $LOCAL)" "$(wslpath -aw $REMOTE)" "$(wslpath -aw $MERGED)"
mergetool.p4merge.trustexitcode=false

总结:

  • Linux子系统现在位于\\wsl$\{发行版名称}\路径下。
  • 这意味着您可以通过\\wsl$\Ubuntu\tmp\访问tmp文件夹,即使是从文件资源管理器!
  • wslpath -aw命令可以为您处理繁重的工作。
  • 该命令现在能够正确将Linux相对路径/tmp/whatever转换为Windows 10的相对路径。

非常感谢您的回答。唯一需要补充的是,您很可能想要使用 wslpath -am\ 转换为 / - Vasiliy
根据我的经验,它不需要-am。但是你可以加上去以防万一。感谢指出! - Neesarg
我已经添加了一个标记,强制在p4merge上使用Unix行结尾 p4merge.exe -le unix。否则它会不断地更改行结尾。 - fbiagi
请注意,如果您使用WinMerge,最后一个参数(带有$MERGED)需要使用/o标志才能正确保存。 - undefined

8

对于Beyond Compare 4,请将以下行添加到您的.gitconfig文件中:

[merge]
    tool = BeyondCompare4
    guitool = BeyondCompare4
[diff]
    guitool = beyondcompare4
[difftool "beyondcompare4"]
    cmd = /mnt/c/Program\\ Files/Beyond\\ Compare\\ 4/bcomp.exe "$(wslpath -aw $LOCAL)" "$(wslpath -aw $REMOTE)"
[mergetool "BeyondCompare4"]
    cmd = /mnt/c/Program\\ Files/Beyond\\ Compare\\ 4/bcomp.exe "$(wslpath -aw $LOCAL)" "$(wslpath -aw $REMOTE)" "$(wslpath -aw $BASE)" "$(wslpath -aw $MERGED)"

3
[diff]下面,我不得不添加一行tool = beyondcompare4,否则当我输入git difftool HEAD^!时,它会打开合并窗口。而且guitool并不是必需的,只需要tool即可。除此之外,它是有效的。非常感谢! - Fabio says Reinstate Monica
@FabiosaysReinstateMonica 没问题。谢谢你。 - Mahmood Dehghan

4

创建文件p4mergebash.sh并设置$PATH:

mkdir -p ~/bin
touch ~/bin/p4mergebash.sh
chmod +x ~/bin/p4mergebash.sh
echo 'export PATH=$PATH:/mnt/c/Program\ Files/Perforce' >> ~/.bashrc
source ~/.bashrc

p4mergebash.sh 内容:

#!/bin/sh

LOCAL="$1"
REMOTE="$2"

case "$LOCAL"
in
    *)
    L=$(echo "C:/Users/<username>/AppData/Local/lxss/rootfs${LOCAL}" | sed 's,/,\\\\,g')
    ;;
esac

case "$REMOTE"
in
    *)
    R=$(echo `git rev-parse --show-toplevel`/"$REMOTE" | sed 's,/mnt/c/,C:/,g' | sed 's,/,\\\\,g')
    ;;
esac

echo "$L"
echo "$R"
p4merge.exe "$L" "$R"

上面的脚本假设你的 AppData 和 git 仓库都在 C: 盘上。请将你的用户名插入到尖括号中 (例如: <username>)。 注意: 确保 p4mergebash.sh 中没有 CRLF
然后设置 git 配置:
git config --global diff.tool p4mergebash
git config --global difftool.p4mergebash.cmd '~/bin/p4mergebash.sh $LOCAL $REMOTE'
git config --global difftool.prompt false

对我来说非常有效(使用meld)。然而,在我的情况下,我不得不稍微更改p4mergebash.sh的内容,以使其与LOCAL匹配,这样它就可以从我的tmp目录中获取远程文件。R=$(echo“C:/ Users / <username> / AppData / Local / lxss / rootfs $ {REMOTE}”| sed's,/,\\,g') - helios456
@rofrol L=$(echo "C:/Users/ysuh/AppData/Local/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs${LOCAL}" | sed 's,/,\\\\,g')我不得不更新bash脚本中的L值。/mnt/c/Program\ Files/Perforce/p4merge.exe "$L" "$R"我还不得不硬编码可执行文件路径。 我无法通过更新.bash_profile中的PATH来使其工作。 - airpower44

0

以下是我在使用p4merge进行合并和比较工具时所使用的.gitconfig配置。同时,也可以将VS Code作为提交信息编辑器:

[diff]
    tool = p4merge
[merge]
    tool = p4merge
[difftool "p4merge"]
    cmd = /mnt/c/Program\\ Files/Perforce/p4merge.exe \"$(wslpath -aw $LOCAL)\" \"$(wslpath -aw $REMOTE)\"
[mergetool "p4merge"]
    cmd = /mnt/c/Program\\ Files/Perforce/p4merge.exe -le unix \"$(wslpath -aw $BASE)\" \"$(wslpath -aw $LOCAL)\" \"$(wslpath -aw $REMOTE)\" \"$(wslpath -aw $MERGED)\"
    trustexitcode = false
    keepBackup = false
[core]
    editor = code -w

我更喜欢BeyondCompare进行三方合并,但在我看来p4merge是最好的免费选项。 要让VS Code与wsl配合使用,请参阅此tutorial


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