【UE4】無料で出来る！コードとアセットを、異なるアクセス権を持つリポジトリで管理し、連携させる方法

# 最初に

 この記事はUE4にてアセット群を管理するためにGitLabを試す記事となります。間違いや更に良い方法があった場合にはそっとTwitter( [@ろっさむ](https://twitter.com/4_mio_11) )やコメント、修正リクエストなどでお知らせ頂けるととても有難いです。 

# 作業環境

記事内で使用する作業環境は以下の通りとなります。

- Unreal Engine：4.23.1



# GitLabとは？

以下の記事が参考になります。

- [GitLab って何?]( https://qiita.com/masakura/items/29f8949379fa86dac22c )
- [GitLabに触ってみて、GitHubと比較した]( https://qiita.com/developer-kikikaikai/items/3fd1277a9a5778000638 )



#  サブモジュールとは？

Aというリポジトリのサブディレクトリとして、Bという別のリポジトリを登録し、Bのコミットハッシュ値を使用してBの特定のコミットを参照する、といった仕組みです。

以下の記事が詳しく書かれています。

[Git submodule の基礎]( https://qiita.com/sotarok/items/0d525e568a6088f6f6bb )

# アセット管理でGitLabを使うメリット

まず初めに、「チーム開発するにおいてUE4の有料アセットをどこで管理するか？」という問題点があると思います。有料アセットをライセンス的な問題でパブリックリポジトリに置くのはちょっと…となるので、そういった場合には、5人以下の少人数チームであればPerforce、BitbucketやGitHubのプライベートリポジトリが選択肢にあがると思います。

今回はそれ以上の人数でアセットを共有する必要がある場合の、アセットの管理方法となります。先ほどあげたホスティングサービスなどは、5人以上でプライベートリポジトリのコラボレーターを登録しようとすると人数に応じて料金がかかってきます。インディーズゲーム開発ではできるだけコストを削減したいところ…。

そこで目についたのが、GtLabでした。GitLabだとプライベートリポジトリ作成無料、コラボレーターにも制限がない、Wiki自体も使いやすい、といったメリットがあります。現在、私たちの開発では、アセットの管理をGitLabのプライベートリポジトリで行い、GitHubのパブリックリポジトリでコード管理を行っています。

今回は、GitLabのアセット用プライベートリポジトリをSubmodule化してUE4エディタから操作できるようにします。



# 実際の手順

## GitHubでプロジェクト用のパブリックリポジトリを作成する方法

こちらの方の記事を参考に作成してみてください。

[UE4のプロジェクトを複数人で開発するためGitHubで管理する]( https://bintololab.com/ue4-github )

作成した後にはプロジェクト下にある`Content`フォルダの中身をコピーして別の場所に保存してから、一旦削除しておいてください。



## GitLabでプライベートリポジトリを作成する方法

以下の記事を参考に「Content」か、それがわかる任意の名前をつけたプライベートリポジトリを作成してください。

[【UE4】アセット管理のためにGitLabを使用する](https://qiita.com/4_mio_11/private/2957739123f2db9e9db6) 

作成した前提で次の項目へ進みます。



## GitLabでのプライベートリポジトリにアセットを移動させる

先ほど別で保存していたContent下のアセット群を、GitLabで作成したプライベートリポジトリに直接移動させます。移動させたら、アセット群をステージングしてコミット、プッシュしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/94530d9c-df25-25bf-626e-e93592aaeadf.png)



## GitLabのプライベートリポジトリをサブモジュールにする

以降はターミナルでコマンドを実行することを想定しています。が、そこまで手順はありません。

まずは以下のコマンドで、カレントディレクトリをプロジェクト自体のフォルダ下へ変更します。

```powershell
cd ProjectFolderName/ProjectName/
```



次に、GitLabでのプライベートリポジトリへのClone用リンクを取得します。今回はHTTPS側を選択しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/36d4cb09-4681-e097-fafb-f14085fda22d.png)



以下のコマンドを実行します。`Content`となっているところがフォルダ名となるので、お間違えの無いよう。

```powershell
git submodule add https://gitlab.com/ProjectURL/content.git Content
```



しばらく待ちます......



もし間違えて、上記コマンドがやり直しとなった場合には、`.gitmodules`と、`.git/index`, `.git/modules/ProjectName/(プライベートリポジトリ名)`の削除、`.git/config`をテキストエディタで開いて以下の文を削除してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/f22d4eaf-2127-bd05-7db9-06bb7c6f0135.png)



サブモジュール化の処理が終わったら、プロジェクトのパブリックリポジトリ側で`.gitmodules`と`ProjectName/プライベートリポジトリ名`を追加変更として登録し、もしContent下のアセットが削除として差分が出ていたらそちらも登録してください。`git add -A`が便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/115356bd-c761-7647-9694-8c2d3af9843d.png)



これでサブモジュール化が完了しました。追加変更として登録した`ProjectName/プライベートリポジトリ名`には`Subproject commit xxxxxxx`と書いてあると思いますが、これはサブモジュール化したリポジトリのどのコミットまでを参照するか、という意味です。こちらはアセット用のプライベートリポジトリ側で変更のコミットがあった場合、プロジェクトのパブリックリポジトリ側でも、このコミットハッシュ値が更新されるため、同様にコミットする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/4a80aabe-2c8d-14d5-274a-56447e2bdaf6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/292edc03-3254-d39e-fffa-f66211b10407.png)



# 最後に

そこまで難しくはないSTEPでサブモジュール化することが可能でした。ただ、サブモジュール化は初めての方は惑う印象があるので、この手順が誰かの助けになれば幸いです。