11

我使用 Windows Subsystem for Linux 提供的 Windows 10 Ubuntu bash。我想为 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

此外,我将以下文件夹添加到 bashPATH变量中,.bashrc以使其可从任何地方调用:

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

所以我的问题是,如果我调用git difftoolbash - 调查更改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任何类似的可视化工具来比较差异并使合并成为可能。

您可以提供给我的任何信息将不胜感激。

4

4 回答 4

19

这个问题的解决方法很简单!

由于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/whatever路径转换为 ​​Windows 10 相对路径。
于 2019-06-11T04:13:18.793 回答
6

对于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)"
于 2020-12-02T22:54:37.463 回答
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 repo 在C:驱动器上。将您的用户名插入尖括号(即<username>)。

注意:确保没有CRLF's in p4mergebash.sh

然后设置 git 配置:

git config --global diff.tool p4mergebash
git config --global difftool.p4mergebash.cmd '~/bin/p4mergebash.sh $LOCAL $REMOTE'
git config --global difftool.prompt false
于 2017-10-16T17:16:12.150 回答
0

这是我用于 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,请参阅本教程

于 2022-02-01T22:01:40.927 回答