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

时间:2017-08-14 19:20:44

标签: windows git bash p4merge

我使用Windows 10 Ubuntu bash。我想为git使用可视化差异/合并工具。我在Windows上安装了p4merge(遵循此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

此外,我将以下文件夹添加到PATH中的bash .bashrc变量中,以使其可以从任何位置调用:

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

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

  • in bash:Unable to translate current working directory. Using C:\Windows\system32
  • p4merge应用程序在调用后立即启动,但会显示以下消息:Error: ... point to an invalid file

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

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

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

非常感谢您提供给我的任何信息。

3 个答案:

答案 0 :(得分:3)

创建文件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 repo位于C:驱动器上。将您的用户名插入尖括号(即<username>)。

注意:确保CRLF中没有p4mergebash.sh

然后设置git config:

git config --global diff.tool p4mergebash
git config --global difftool.p4mergebash.cmd '~/bin/p4mergebash.sh $LOCAL $REMOTE'
git config --global difftool.prompt false

答案 1 :(得分:1)

此问题的解决方案得到了简化!

借助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 $ \ {发行名称} \ 路径中。
  • 这意味着您可以访问 \\ wsl $ \ Ubuntu \ tmp \ 中的 tmp文件夹。即使是从文件资源管理器!
  • wslpath -aw 命令为您完成了繁重的工作。
  • 该命令现在可以正确地将Linux相对 / tmp / whatever 路径转换为Windows 10相对路径。

答案 2 :(得分:0)

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