Git
Ubuntu
WinMerge
WSL

WSL(Ubuntu 18.04)環境のgitでWinMergeを使う方法

「Windows 10 April 2018 Update」の Ubuntu 18.04 環境対応です。

パス変換のコマンド wslpath が提供されるようになったので簡単になりました。

WinMergeは3wayマージ対応の日本語版を前提にしています。

WinMerge 日本語版


作業パス変更


リポジトリを /mnt/c 以下に置く

/home/username 以下はWindowsアプリから扱えないので、/mnt/c/Users/username 以下で作業します。

わざわざ cd /mnt/c/Users/username とするのも面倒であれば、シンボリックリンクを作成してもいいです。

$ cd ~

$ ln -s "/mnt/c/Users/username" win
$ cd win; mkdir gitwork; cd gitwork
$ git init
$ git ...


テンポラリフォルダのパスを変更する

gitの外部ツール連携の仕組みは、一旦テンポラリフォルダにチェックアウトしてから、そのパスを渡すというものです。

WSLではWindows側から見えないパスがテンポラリフォルダとして設定されていますので、Windows側に変更する必要が有ります。

~/.bashrc に以下をコピペします。

export TMPDIR=`cmd.exe /C echo %TEMP% | tr -d '\r' | sed -e 's|\\\\|\\\\\\\\|g' | xargs wslpath -ua`

(バックスラッシュが多いですが、sedで1回、シェルスクリプトに記載するのにさらにエスケープ、そしてwslpathにパイプで渡す際にもエスケープが必要な為です。2*2*2=8)

参考) wslpathコマンド

WindowsのパスをWindows表記とWSL(Linux)表記で相互変換する為のツールです。

a. WindowsパスからWSLの絶対パスへの変換

$ wslpath -ua 'C:\Users'

/mnt/c/Users

b. WSLパスからWindowsの絶対パスに変換

$ wslpath -wa '/mnt/c/Users'

C:\Users

相対パスのまま変換する場合は、aオプションを外します。


Gitに WinMerge を設定する

~/.gitconfig に以下を記載します。

[diff]

tool = WinMerge
[difftool]
prompt = false
[difftool "WinMerge"]
path = 'WinMergeU.exe'
cmd = \"WinMergeU.exe\" -e -r -u -wl -dl Local -wr -dr Remote \"`wslpath -wa $LOCAL`\" \"`wslpath -wa $REMOTE`\"
trustExitCode = false
[merge]
tool = WinMerge
[mergetool]
prompt = false
keepBackup = false
[mergetool "WinMerge"]
cmd = \"WinMergeU.exe\" -r -e -u -al -dl Local -wm -dm Remote -wr -dr 共通祖先 \"`wslpath -wa $LOCAL`\" \"`wslpath -wa $REMOTE`\" \"`wslpath -wa $BASE`\" -o \"`wslpath -wa $MERGED`\"
trustExitCode = false
[alias]
windiff = difftool -y -d --no-symlinks -t WinMerge
winmerge = mergetool -y -t WinMerge


使い方


  • 比較

git diff と同じです。

git windiff [比較元] [比較先]


  • マージ

git mergeとかpull, rebase, cherry-pick などでコンフリクトしたら、

git winmerge

と叩いて下さい。

3Wayマージを行います。

image.png

左側がローカルの作業ファイル、中央がマージ対象、右側が両ブランチの共通祖先となるコミットです。

共通祖先に対して修正箇所が被らない所が、左側のローカルにオートマージされた状態です。

両方で修正されていてコンフリクトになっている所(一番下)は、Location Paneで赤くなるようです。

必要な編集を行って保存し、WinMergeを閉じるとファイルがステージングされた状態になります。

あとはコミットするだけです。