7
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

「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にパイプで渡す際にもエスケープが必要な為です。222=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を閉じるとファイルがステージングされた状態になります。
あとはコミットするだけです。

7
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?