つくるの大好き。

つくるのが大好きな人の記録。

GitリポジトリをまたいだUnityプロジェクト間のソース共有

今日Twitter上でちょっと話題が出たUnityプロジェクト間でのソース共有について今運用している方法を書きます。

Unityプロジェクト間でのソース共有でよくあるのが下記パターンかなと思います。

  1. ファイルコピー
  2. Unityパッケージをエクスポート/インポート

いずれも人力なので事故りやすくちょっと21世紀のやり方じゃないような気がしますね(笑)
そこでgit submodule を使ってみました。

プロジェクトの構成

共有する方のUnityプロジェクトSharedLibと共有される方のUnityプロジェクトAppがあるとします。
それぞれは別のGitリポジトリに保存されているとします。

f:id:peugeot-106-s16:20190130224322p:plain

Unityプロジェクトを git submodule した際の問題点

この場合App/Assets配下のフォルダに普通にgit submodule するとSharedLibのProjectSettings等もpullしてしまうのでおかしなことになります。

f:id:peugeot-106-s16:20190130224152p:plain

特定のフォルダ配下のみをpullする設定

git submoduleすると共に特定のフォルダ配下のみをpullする設定 "core.sparsecheckout" を有効にし、指定フォルダ名を設定ファイルに書き込んだあとpullします。 この一連の処理は開発メンバー1人1人がローカルで行う必要があるので、下記のようなバッチファイルを作って共有しました。

git submodule add --force https://github.com/HogeHoge/SharedLib.git Assets/SharedLib
git commit -m "add module"
cd Assets/SharedLib
git config core.sparsecheckout true
echo /Assets/SharedLib/ > ../../.git/modules/Assets/SharedLib/info/sparse-checkout
git read-tree -mu HEAD

こうすると必要なファイルだけpullすることができるようになります。

f:id:peugeot-106-s16:20190130225407p:plain

最新状態に同期する

git submoduleというのはリポジトリのあるcommitに対してリンクを貼るものなので、SharedLibリポジトリにその後入った変更が自動的にAppリポジトリに反映されることはありません。
最新版に同期したいときは下記のコマンドを利用します。
これも開発メンバーが個々にローカルで行う必要があるのでバッチファイルにして配布しています。

git submodule foreach git pull origin master

このバッチを走らせてね~!っていう通達は人力なので「勝手にやらない」「やるときはみんなやる」っていうのを気を付けないといけないといえばいけないですが、勝手にしても自分にビルドエラーが出るくらいの軽傷で済むのではないでしょうか。

ちなみにバッチファイルはAppリポジトリに含めることで配布し、README.mdに説明を書いておきました。


便利なバッチファイルを作りました。

  • AddModule.bat - submoduleを追加します。1度だけ使ってください。
  • UpdateModule.bat - 最新のFrameworkに更新します。何度でも使えます。

まとめ

GitリポジトリをまたいだUnityプロジェクト間のソース共有を git submodule で行う方法を書きました。
今のところ無事故でうまくいっているのでよかったら参考にしてください。