BETA

既存のUE4プロジェクトをGit Lfsでバージョン管理してみた覚書

投稿日:2019-12-19
最終更新:2019-12-19

免責事項

個人的なプロジェクトでとりあえずやってみたエモいポエムです。
操作ミスや不具合等により破壊的な変更が発生する可能性がありますので、事前のバックアップなど自己責任でお願いします。まちがってたらご指摘頂けると助かります!!!

いつものコピペ

本記事に記載の情報において、可能な限り正確な情報を掲載するよう努めています。しかし、誤情報が入り込んだり、情報が古くなったりすることもあります。必ずしも正確性を保証するものではありません。また合法性や安全性なども保証しません。

動機

あんまり理解しないままにUE4で開発してたらいつの間にかプロジェクトが肥大化してて、そろそろなんとかしないと不安で夜しか眠れない状況になってました。買って3週間くらいの1TBのSSDも読み込み不良になったばっかりでいろいろ笑えない。

  • 気がついたらプロジェクトが20GBくらいになってた
  • 暗黙的な依存関係が怖くてやばい。夜中に妖精さんに悪戯されたら壊れそう
  • コピー&ペースでバックアップしてたらリニアに容量食ってやばい
  • クラウドストレージに逃すにしても細かいファイルも多くて差分管理辛み。小さすぎたり特殊なファイル名だとコピー対象にならなかったりで「は?知らんわ」ってなる
  • バージョン管理使おうとしてGit自体に制限は無いけど、大抵のホスティングサービスは1ファイルあたり100MBとかの容量制限あり
  • できれば運用コスト払いたく無いけど数百円/月なら払っても良い。マネージドサービス最高。潰れたらそれを選んだ俺が悪いの精神。DIYできるのは心と金と時間に余裕あるやつだけや!!!

そんな思いで選んだメンツは以下の通り。

構成

項目 サービス/クライアント 備考
Git Hosting GitHub 無料プラン
Git LFS Hosting GitHub $5/月
・容量50GB
・転送50GB
Git Client /
Git LFS Client
・Windows版Git + GitLFS
・Mac版Git + GitLFS
・Linux版Git + GitLFS
・UE4ソースコントール
・VS Code
※ UE4とVS CodeはOSのGitを利用

ローカルはGit + Git LFSで管理して、GitホスティングはGitHubの無料プランを使いつつ、Git LFSのホスティングはGitHubに$5/月支払って面倒みてもらう作戦。クライアント環境としてはWindowsでもMacでもLinuxでも動く(多分)。もし50G超えるようならそん時考えるけど転送に関しては20GBのアップストリームとダウンストリームで超えそうな気がしなくも無い。

Git LFS?

Git Large File Storage
テキスト形式のファイルを比較しながら管理するGitの仕組み上、バイナリファイルを扱うと無駄が多いしパフォーマンスも悪い。バイナリファイルはGit外部のGit LFSに実体を管理させて、GItリポジトリ内にはバイナリファイルへの参照を記録して必要になったら取りに行くようにするGitの機能拡張。

一旦リポジトリに登録しちゃえばGit Hookに登録されてGitクライアントが透過的に実行するので、利用者はあんまり意識しなくてもok。バイナリファイルの保管先はGitの管理外になるので別途用意する必要があるけど、大抵のGitホスティングサービスはGit LFSのホスティングも実質有償で提供してる。

ほかの選択肢

Azure DevOps

Git + Git LFS対応。しかも無料らしい。
頑張ったけど初回pushが終わらない状態になったのでとりあえず保留。

AWS S3 + Lambda + API Gateway

GitはGitHubにpushして、Git LFSはAWS API Gateway + Lambda + S3のスタックにpushするパターン。Git LFSの運用ノウハウが全然ないのでリスクが増えるだけだなと見送り。利用料的には無茶苦茶安そうなので、GitHubが$5/月を超えたら考える。個人的にAPI Gatewayにあまりいい思い出がないので判断に恣意的な可能性あり

他のGitホスティングサービス

GitLabとかGitBucketとか。Git LFS対応してるけど基本お金かかるのでGitHubでいいかな。
もし転送が速いなら引越しもアリ寄りのアリ。

NASでローカルホスティング

理論上パフォーマンスは最高。金額的にも手間的にもコスト高。HDDとSSDは消耗品(戒め)。
最近のNASはDocker建てられるのでリポジトリ作成自体は簡単そう(多分)

ホスティングサービス + ローカルリポジトリ(ホットキャッシュ)とか階層化できるとずっと寝てても大丈夫そうな安心感ある。宝くじ当たったら考える。

所感

GitとGit LFSの学習コスト高い

  • Gitさえ良くわからないのにGit LFSってなんやねんってなる
  • トラブった時に切り分けして問題解決するの辛い
  • Gitオンリーと比較して「なんでインデックスすぐ壊れてしまうん」って印象。あんまり恋には落ちない説ある

取り回しの悪さ

  • 初回のpush/cloneに時間かかる
  • そのせいか途中でabendしてインデックスおかしくなったりしてイケてない
  • clone後は中間生成物作ったりビルド走るので時間かかる
  • 運用載せちゃえば個人的な範囲ではこまめにpushしとけばそんなにしんどくは無さそう

作業ログ

めちゃくちゃ参考にならないので参考までに

前提

  • GitHubのアカウント作成済み
  • UE4のプロジェクトがローカルに存在しててGitの管理下に置いてない
  • WIndows10 + ターミナル上の操作はUbuntu(WLS)

GitHub LFSに課金しとく

無料プランに1GBの保管と転送含まれてるのでお手元のリポジトリがそんなに大きくないなら場合は飛ばしてok。

Git Large File Storage をアップグレードする - GitHub ヘルプ

GitとGit LFSインストール

公式から各プラットフォームにあった手順でそれぞれインストールしとく。

Git - Download
Git LFS - Download

※ WSL使うならWindowsとWSL環境のどちらにも入れとく

giboインストール

コマンドでgitignore生成できるようにgiboインストールしとく。
github/gitignoreからコピペするなら不要。

既存プロジェクトをGit管理下に置く

Git BashかWLSでプロジェクトのディレクトリに移動して下記を実行。

# gitリポジトリの初期化  
git init  

gitignore追加

※ gibo使わない場合は不要。自由に.gitignoreを編集する。

# .gitignoreにgit管理対象外のファイルを追加  
gibo dump unrealengine windows macos linux >> .gitignore  

# お好みで利用してるエディタも追加  
# gibo dump VisualStudioCode >> .gitignore  
# gibo dump VisualStudio >> .gitignore  

git lfsをgit hookに追加する

git hookにglt lfsを登録して.gitattributesに登録したファイルをgit lfs管理にする。

# git lfs管理する場合リポジトリ毎に1回実行する  
git lfs install  

git lfsの管理対象を追加

.gitattributesファイルを作って↓をコピペする。

*.uasset filter=lfs diff=lfs merge=lfs -text  
*.umap filter=lfs diff=lfs merge=lfs -text  
*.bmp filter=lfs diff=lfs merge=lfs -text  
*.float filter=lfs diff=lfs merge=lfs -text  
*.pcx filter=lfs diff=lfs merge=lfs -text  
*.png filter=lfs diff=lfs merge=lfs -text  
*.psd filter=lfs diff=lfs merge=lfs -text  
*.tga filter=lfs diff=lfs merge=lfs -text  
*.jpg filter=lfs diff=lfs merge=lfs -text  
*.exr filter=lfs diff=lfs merge=lfs -text  
*.dds filter=lfs diff=lfs merge=lfs -text  
*.hdr filter=lfs diff=lfs merge=lfs -text  
*.wav filter=lfs diff=lfs merge=lfs -text  
*.mp4 filter=lfs diff=lfs merge=lfs -text  
*.obj filter=lfs diff=lfs merge=lfs -text  
*.fbx filter=lfs diff=lfs merge=lfs -text  
*.zip filter=lfs diff=lfs merge=lfs -text  
*.xlsx filter=lfs diff=lfs merge=lfs -text  
*.docx filter=lfs diff=lfs merge=lfs -text  
*.pptx filter=lfs diff=lfs merge=lfs -text  

めんどくさい場合はヒアドキュメントで生成する

# .gitattributesに対象ファイルを追加  
cat <<'EOF' >> .gitattributes  
*.uasset filter=lfs diff=lfs merge=lfs -text  
*.umap filter=lfs diff=lfs merge=lfs -text  
*.bmp filter=lfs diff=lfs merge=lfs -text  
*.float filter=lfs diff=lfs merge=lfs -text  
*.pcx filter=lfs diff=lfs merge=lfs -text  
*.png filter=lfs diff=lfs merge=lfs -text  
*.psd filter=lfs diff=lfs merge=lfs -text  
*.tga filter=lfs diff=lfs merge=lfs -text  
*.jpg filter=lfs diff=lfs merge=lfs -text  
*.exr filter=lfs diff=lfs merge=lfs -text  
*.dds filter=lfs diff=lfs merge=lfs -text  
*.hdr filter=lfs diff=lfs merge=lfs -text  
*.wav filter=lfs diff=lfs merge=lfs -text  
*.mp4 filter=lfs diff=lfs merge=lfs -text  
*.obj filter=lfs diff=lfs merge=lfs -text  
*.fbx filter=lfs diff=lfs merge=lfs -text  
*.zip filter=lfs diff=lfs merge=lfs -text  
*.xlsx filter=lfs diff=lfs merge=lfs -text  
*.docx filter=lfs diff=lfs merge=lfs -text  
*.pptx filter=lfs diff=lfs merge=lfs -text  
EOF  

.gitignoreと.gitattributes、UE4のプロジェクトファイルをgit管理に追加

git add .gitignore  
git add .gitattributes  
git add *  

変更をコミット

git commit -m "さいしょのコミットコメント"  

ここまで来ればローカルリポジトリが出来るのでバージョン管理がはじめられます。

リモートリポジトリを作成

GitHubにプロジェクトを作成。

ローカルリポジトリにoriginを追加

「…or push an existing repository from the command line」に習ってoriginを追加します。

git remote add origin https://github.com/{GITHUB ID}/{PROJECT NAME}.git  

# originに追加されてればok  
git remote -v  

originへ同期

git push -u origin master  

しばらく待機してpushが完了したらGitHubのプロジェクトページを開いて同期完了してるのを確認する。

cloneしてテスト

pushしたプロジェクトに不備がないか、新たにリポジトリをcloneして確認。

# 新しいディレクトリで実行  
git clone https://github.com/{GITHUB ID}/{PROJECT NAME}.git  

お疲れ様でした。UE4でプロジェクトを開いて動作問題なさそうならokです。
必要ならUE4のソースコントロールと接続してください。

ちなみに、cloneしたリポジトリはoriginがすでに登録済みなので、git remote addせずにgit pushでリモートリポジトリにpush可能です。

トラブったところ

①ファイルでかくてrejectされた

プロジェクトディレクトリで↓でも叩いて100MB以上のファイル探してlfsの管理下に追加してください。
1GB超えるファイルあったらNASを仕込む準備でもはじめましょう。

# 犯人捜し  
find ./ -ls | sort -nk 7 | awk '{print $7/1024/1024, $11}'  

②ファイル変更をcommitしたり取り消し操作したらマップロードできなくなった

マップのロードに失敗しました!  

とか

 "Failed to load map!"   

が出てお手上げ状態に。

Git LFSで作成したリポジトリをGit LFSクライアントが入ってない環境から触ると壊れるっぽい。
Gitクライアントの操作ログにはエラーとして上がらないので気をつける。

WSLで作業してて、動作確認でWindowsにGit LFS入れてない状態で操作してプロジェクトを壊すというあほな事やってた。

エラーメッセージで検索したら過去バージョンのUE4ソースコントロールだとGit LFS対応してなかったみたいなので旧バージョン使ってる場合は注意。

"Failed to load map!" .. appears to be an asset. - Unreal Engine Forums

③push/cloneしたら途中で進まなくなった

GitとGit LFSで2回githubの認証要求されるのでGit LFSフェッチのタイミングで止まる。
地味にめんどくさいのでsshとかauth覚えてくれるclientでやった方がよさそう。

まとめ

これで安心して昼も眠れそうです。

参考

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

okd.shのTechのフリしたポエム

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう