Unityのgit管理をWSL2でやる

最近久しぶりにUnityでゲーム作りをしています。

共同で開発するためにgitを使うのですが、gitコマンドをWSL2から使用するといまいちな感じになったので、何とかする方法のメモです。

プロジェクトはWSL2の外に作る

UnityプロジェクトをWSL2の中(/home/lpha/以下など)に作るとうまくいかなかったので、Windows領域(/mnt/c/Users/lpha/Desktop/以下など)に置くことにしました。 いちいちcd /mnt/c/Users/lpha/Desktop/などと打ち込むのも面倒なので、cdsというエイリアスを作りました。

パーミッションの管理

WindowsにはUNIX系のようなファイルパーミッションの概念がないようで、この部分で問題が発生します。 新しく作ったファイルやUnityが自動生成したファイル(.metaファイルなど)のパーミッションは、VisualStudioやSourceTreeなどのWindows向けgitクライアントからコミットすると、644になります。 一方で、このリポジトリをWSL2のgitコマンドで見ると、コミット直後にもかかわらず変更があるように表示されます。 これは、Windows領域のファイルが755扱いで見えているからです。 つまり、gitの認識している状態(HEADではファイルのパーミッションは644)とWSL2の認識している状態(ファイルのパーミッションは755である)が異なるので、変更があるように表示されます。

また、git reset --hard HEADなどとしても、変更がある状態のままになってしまいます。 これは、WSL2はWindows領域のファイルのパーミッションを(デフォルトだと)記録せず、常に755であると認識するためです(記録されないので変更することもできません)。 これに対しては対処方法があります。 /etc/wsl.confに以下の記述を行うことで、Windows領域のファイルのパーミッションを記録することができるようになります(metadataの部分が重要)。

[automount]
options="metadata,umask=22,fmask=11"

なお、この記述を加えた後、WSL2を再起動する必要があります。 そのためには、コマンドプロンプトから以下のコマンドを実行します。

wsl --shutdown

パーミッションの管理2

このように設定しても、デフォルトのパーミッションが一貫していない点は変わりがありません。 なので、VisualStudioやSourceTreeなどからコミットした直後は、WSL2のgitコマンドで見ると変更がある状態になっています。 これは、Windows領域で新規作成されたファイルのパーミッションは何も記録されていないので、WSL2としては755であると判断するしかないためです。 しかし、git reset --hard HEADなどとすれば、ファイルのパーミッションが644に変更され、“正しい”状態になります。 これにより変更がある状態は解消され、以降のgitコマンドはいつも通り使える状態になります。

また、WSL2のgitコマンドでgit commitする場合は、ファイルのパーミッションが755になっていないか気を付けたほうが良いでしょう。 そうしないと、パーミッションが変更されるだけのコミットができたりして、コミット履歴が汚くなってしまいます。 これは多分pre-commitフックなどを使って対処するべき問題のような気がしますが、コミット作成はGUIツールの方が楽なのでgit commitコマンドを直に使用することがなく、放置しています。

メモ

どうもパーミッションを無視するという設定もできるようです。 ただ、私がWSL2からgitコマンドを使用したいという理由で共同開発者全員に強制するのも忍びなく、WSL2を使う側の負担のみで可能な方法を紹介しました。