GitリポジトリをまたいだUnityプロジェクト間のソース共有
今日Twitter上でちょっと話題が出たUnityプロジェクト間でのソース共有について今運用している方法を書きます。
Unityアプリのソース管理ってどうしてますか?
— 中村 薫 (@kaorun55) January 30, 2019
サブモジュール的な共通機能をどうやって管理してるのかわからん。
Unityプロジェクト間でのソース共有でよくあるのが下記パターンかなと思います。
- ファイルコピー
- Unityパッケージをエクスポート/インポート
いずれも人力なので事故りやすくちょっと21世紀のやり方じゃないような気がしますね(笑)
そこでgit submodule を使ってみました。
プロジェクトの構成
共有する方のUnityプロジェクトSharedLibと共有される方のUnityプロジェクトAppがあるとします。
それぞれは別のGitリポジトリに保存されているとします。
Unityプロジェクトを git submodule した際の問題点
この場合App/Assets配下のフォルダに普通にgit submodule するとSharedLibのProjectSettings等もpullしてしまうのでおかしなことになります。
特定のフォルダ配下のみを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することができるようになります。
最新状態に同期する
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 で行う方法を書きました。
今のところ無事故でうまくいっているのでよかったら参考にしてください。