如何在 Windows 10 Ubuntu bash 上使用 difftool 和 mergetool (WSL)
How to use difftool and mergetool on Windows 10 Ubuntu bash (WSL)
我使用 Windows 10 Ubuntu bash,由 Windows 子系统为 Linux 提供。我想为 git 使用视觉 diff/merge 工具。我安装了 p4merge on Windows (followed this artice) 并使用以下方式配置了 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 中:
Unable to translate current working directory. Using C:\Windows\system32
。
p4merge
应用程序在调用后立即启动,但给出以下消息:Error: ... point to an invalid file
。
如果我没理解错的话,这个问题可能是因为 Windows 程序(即 p4merge
)找不到用 Linux 文件路径引用的文件(例如 /mnt/c/..
)。
有什么办法可以解决这种问题吗? (也许这是一个更普遍的问题:使用来自 Windows 应用程序的 Linux 路径。)
无论如何,我并不坚持使用p4merge
,而是使用任何类似的可视化工具来比较差异并使合并成为可能。
如果您能提供给我任何信息,我们将不胜感激。
创建文件 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=""
REMOTE=""
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
- how to make git difftool to always export absolute paths
- https://askubuntu.com/questions/759880/where-is-the-ubuntu-file-system-root-directory-in-windows-nt-subsystem-and-vice
- Replace forward slash with double backslash enclosed in double quotes
- https://gist.github.com/rcapraro/aad8a8c3ad96fe563fce
此问题的解决方案已简化!
感谢 Windows 10 version 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/whatever 路径转换为 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)"
这是我用于 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 一起工作,请参阅此 tutorial。
我使用 Windows 10 Ubuntu bash,由 Windows 子系统为 Linux 提供。我想为 git 使用视觉 diff/merge 工具。我安装了 p4merge on Windows (followed this artice) 并使用以下方式配置了 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 中:
Unable to translate current working directory. Using C:\Windows\system32
。 p4merge
应用程序在调用后立即启动,但给出以下消息:Error: ... point to an invalid file
。
如果我没理解错的话,这个问题可能是因为 Windows 程序(即 p4merge
)找不到用 Linux 文件路径引用的文件(例如 /mnt/c/..
)。
有什么办法可以解决这种问题吗? (也许这是一个更普遍的问题:使用来自 Windows 应用程序的 Linux 路径。)
无论如何,我并不坚持使用p4merge
,而是使用任何类似的可视化工具来比较差异并使合并成为可能。
如果您能提供给我任何信息,我们将不胜感激。
创建文件 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=""
REMOTE=""
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
- how to make git difftool to always export absolute paths
- https://askubuntu.com/questions/759880/where-is-the-ubuntu-file-system-root-directory-in-windows-nt-subsystem-and-vice
- Replace forward slash with double backslash enclosed in double quotes
- https://gist.github.com/rcapraro/aad8a8c3ad96fe563fce
此问题的解决方案已简化!
感谢 Windows 10 version 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/whatever 路径转换为 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)"
这是我用于 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 一起工作,请参阅此 tutorial。