空飛ぶアヒル亭

unityとかue4とか触ってます。なにもわからないのでブログを書いています。

ローカルのマージツールとして設定したUnityYAMLMergeでマージする

Unityプロジェクトをgitで管理したいということで色々調べていたらUnityYAMLMergeに辿り着きました。

UnityYAMLMergeはザックリ言うと同一シーンやプレハブをブランチ切って同時に編集しても、同一パラメータなどを変更してなければ上手くマージしてくれるというツールです。 設定方法をググっているとSourceTreeでのUnityYAMLMergeの設定方法はたくさん出てきたのですが、僕はSourceTreeではなくネイティブなgitでUnityYAMLMergeを使うことにしました。

メモ程度の記事ですが、何か間違えてるぞという点があればお教えください。

目次

SourceTreeを使いたくない理由

SourceTreeだとリポジトリ毎にマージツールを設定することができずグローバルな設定として扱われます(多分)。

Unityプロジェクト専用のマシンだったらそれでもいいかもしれませんが、僕はUnityプロジェクト以外にもgitで管理するものがあるのでマージツールなどはなるべくリポジトリ単位で設定したい… というわけで普通にgitでUnityYAMLMergeをローカルのマージツールとして使えるようにします。

設定方法

ローカル(リポジトリ単位)でのマージツール設定

管理したいUnityプロジェクトフォルダ直下の.gitフォルダにあるconfigファイルに以下を追加します。

[merge]
    tool = unityyamlmerge
[mergetool "unityyamlmerge"]
    trustExitCode = false
    cmd = '[UnityPath]/Editor/Data/Tools/UnityYAMLMerge.exe' merge -p "$BASE" "$REMOTE" "$LOCAL" "$MERGED"

[UnityPath]の部分はUnityまでのパスを適宜入力してください。 僕の場合は以下の場所にありました*1

C:\Program Files\Unity\Editor\Data\Tools\UnityYAMLMerge.exe

autoファイル追加

詳細は以下

おそらくコンフリクト時に使用する外部diffツールを設定するファイルだと思うのですが、イマイチわかっていません。 とりあえずいろんな記事でP4Mergeを使っているので、僕も右にならえということでP4Mergeをインストール。

そしてUnityプロジェクトフォルダ直下にautoファイルを作成し、以下を入力しておきます。

* use "%programs%\Perforce\p4merge.exe" "%b" "%l" "%r" "%d"


設定は以上です。

検証

テスト用のプロジェクトYAMLMergeTestを作成してブランチを切り、わざとコンフリクトさせてみます。

コンフリクトの準備

まず、シーンにCubeを一つおいただけのプロジェクトを作りました。

f:id:onceduck:20190108001831p:plain
YAMLMergeTest masterブランチ

次に、ここでブランチを切りtestブランチを作成し、Cylinderをシーンに追加しました。

f:id:onceduck:20190108002509p:plain
testブランチ(Cylinderが追加されている)
f:id:onceduck:20190108002542j:plain
testブランチのログ

masterブランチに移り、シーンにSphereを追加します。これでマージ時にコンフリクトするはずですね。

f:id:onceduck:20190108002809p:plain
Sphereを追加したmasterブランチ
f:id:onceduck:20190108002926j:plain
masterブランチのログ

マージしてコンフリクトを解消する

$ git merge testでmasterブランチとtestブランチをマージしてみましょう。 f:id:onceduck:20190108003236j:plain コンフリクトしました。

では$ git mergetoolコマンドでUnityYAMLMergeを起動してみます。

f:id:onceduck:20190108003744j:plain ちょっとここで僕は$ git mergetool -t unityyamlmergeと入力しているのですが、$ git mergetoolで大丈夫だと思います、多分…

これで無事マージされました。 f:id:onceduck:20190108004043j:plain

Unityプロジェクトを開いてみます。 f:id:onceduck:20190108004220p:plain

SphereとCylinderが追加され、うまいことマージされているのがわかります。

以上で検証は終了です。UnityYAMLMergeを使えば同一シーンの編集などが一応できるみたいですね。

勘違いしていたこと

僕のgitについての知識が乏しく、マージツールというものを初めて使ったので勘違いしていたことがありました。

マージツールはコンフリクト後に初めて起動するツールらしく、$ git mergeの時点では起動しないんですね。 最初からコンフリクトが発生しないようにマージしてくれるものだと勘違いしており、「めっちゃコンフリクトしてるやん!」と勝手にキレていました。

ともあれ、多少手がかかりますがこれにて無事リポジトリ単位で設定したUnityYAMLMergeを使うことができました。

参考記事

*1:UnityHub使ってる場合、おそらく使うUnityバージョンによってパスが異なります

f:id:onceduck:20190108020120p:plain
Hubから起動したプロジェクトにはこのパスを使いました