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



我使用Windows 10 Ubuntu bash,由Windows Subsystem for Linux提供。我想为 git 使用视觉差异/合并工具。我在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中将以下文件夹添加到 bashPATH变量中,使其可从任何地方调用:

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

所以我的问题是,如果我在 bash 中打电话给git difftool- 用p4merge调查更改 - 我收到以下消息

  • 在 bash:Unable to translate current working directory. Using C:Windowssystem32.
  • p4merge应用程序在调用后立即启动,但给出以下消息:Error: ... point to an invalid file

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

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

无论如何,我不坚持使用p4merge而是使用任何类似的可视化工具来比较差异并使合并成为可能。

您能向我提供的任何信息将不胜感激。

这个问题

的解决方案被简化了!

由于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$\{distro name}\路径。
  • 这意味着您可以访问 \\wsl$\Ubuntu\tmp\ 的tmp 文件夹。甚至从文件资源管理器!
  • WSLPATH -AW命令为您完成繁重的工作。
  • 该命令现在可以将 Linux 相对/tmp/any路径正确转换为 Windows 10 相对路径。

对于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)"

创建文件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
  • 如何使 git difftool 始终导出绝对路径
  • https://askubuntu.com/questions/759880/where-is-the-ubuntu-file-system-root-directory-in-windows-nt-subsystem-and-vice
  • 将正斜杠替换为用双引号括起来的双反斜杠
  • https://gist.github.com/rcapraro/aad8a8c3ad96fe563fce

以下是我用于 p4merge 的 .gitconfig 行,用于合并和差异工具。还要使用 VS 代码作为提交消息编辑器:

[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 的 3 向合并,但在我看来,p4merge 是最好的免费选择。 若要使 VS Code 使用 wsl,请参阅本教程。

相关内容

  • 没有找到相关文章