簡體   English   中英

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

[英]How to use difftool and mergetool on Windows 10 Ubuntu bash (WSL)

我使用 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

此外,我將以下文件夾添加到.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 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 ,而是使用任何類似的可視化工具來比較差異並使合並成為可能。

您可以提供給我的任何信息將不勝感激。

這個問題的解決方案簡化了!

由於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 相對路徑。

對於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

這是我用於 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,請參閱本教程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM