【Github】Unityプロジェクトをgithubに上げようとしたときやけに重いときの対処法
はじめに
こんにちは、enari_Kと申します。普段は東京科学大学(旧東工大)で材料工学を専攻する傍らtraPというサークルでゲーム制作、競プロ、kaggle、web開発などに取り組んでいます。
今回はこれまでに何度もgithubでトラブった経験から、Unityプロジェクトをgithubに上げようとしたとき重い場合の対処法についてまとめてみました。
そもそも不要なファイルとは
例えば、UnityのLibraryフォルダなどは自分のPC専用のキャッシュであり、他の人のPCやビルド環境では自動生成されるからリポジトリに含める必要はありません。むしろ新しくプロジェクトに入る人がダウンロードするのに時間がたくさんかかったり、あるいは環境ごとに生成されるライブラリの内容が異なるのでコンフリクトの原因になってしまったりなどよくないことだらけですので、このような不要なファイルはgithub上に上げないことが推奨されます。
重いの判定基準
UnityプロジェクトをGitHubにアップロードする際、多くの場合10分以上かかることは稀です。また、以下のようなメッセージがコンソールに出力されてgithub側に受け取りを拒否された場合も下記のような設定ミスを疑ってみてください。私が以前制作した絵とコマ送りモーションを大量に含み重いはずのプロジェクトは恥ずかしながら完成後にfirst commitしたのですがその時も5分と掛かりませんでした。ですのでUnityプロジェクトgithubに上げるときに10分以上かかったらまず、以下の項目を疑ってみてください。
remote: error: File path/to/huge_file.ext is 150.00 MB; this exceeds GitHub's file size limit of 100.00 MB
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
To https://github.com/user/repo.git
! [remote rejected] main -> main (pre-receive hook declined)
error: failed to push some refs to 'https://github.com/user/repo.git'
そもそも.gitignoreを入れてない
.gitignoreをUnityプロジェクトに入れないと、github上に不要なキャッシュまであげられてしまいます。こちらからUnity用の.gitignoreをダウンロードして、.gitignoreに名前を変更したのちにUnityプロジェクトのルートディレクトリ(=Libraryなどがあるのと同じ階層)に移動しましょう。
.gitignoreの名前が間違っている
Unityの公式からダウンロードした.gitignoreはUnity.gitignoreという名前ですが、そのままだと機能しません。.gitignoreに変更しましょう。
.gitignoreを入れる位置が間違っている
unity.gitignoreは初期設定だと同じ階層の指定されたフォルダを無視するようになっています。この場合無視するフォルダは、.gitignore ファイルが置かれた場所から見た相対パスで決まります。 例えば、/Library/ と記述されている場合、それは「.gitignoreと同じ階層にあるLibraryフォルダ」を指します。もしUnityプロジェクトがさらに1つ下のフォルダにあるのに、ルートディレクトリに .gitignore を置いたままだと、正しくキャッシュを弾けないことがあります。必ず、Assets や Library フォルダが見える一番上の階層に配置しましょう。
.gitignoreを入れるタイミングが遅かった
一度、gitignore入れる前に誤ってコミットをしてgithub側に受け取り拒否されてしまった後に.gitignoreを入れてからもう一度コミットしようとすると前回との差分をとる関係上、不要なファイルの削除命令も一緒にコミットしてしまうので.gitignoreを入れたにもかかわらず重くなってgithub側に受け取り拒否されてしまいます。 Gitは「過去の履歴」をすべて保存する性質があるため、最新の状態で消しても過去の巨大ファイルは消えません。下記のような一連のコマンドを打ち、.git フォルダ(履歴)ごと削除してリセットしましょう。
# 1. 過去の失敗した履歴を完全に消去する(隠しフォルダを消します)
rm -r .git
# 2. Gitを初期状態から作り直す
git init -b main
# 3. GitHub上のリモートリポジトリと再接続する
git remote add origin https://github.com/ユーザー名/リポジトリ名.git
# 4. 改めてadd(ここで.gitignoreが初めて正しく機能し、Library等が除外されます)
git add .
# 5. きれいな状態で初回のコミット
git commit -m "Initial commit: クリーンな状態でアップロード"
# 6. 強制的にプッシュ(--forceでGitHub側の不完全なデータを上書きします)
git push -u origin main --force
Unity内のフォルダを動かしてしまった
.gitignoreは相対パスでどのフォルダを無視するか決めています。通常Unityの.gitignoreは下記のようになっているので、これを動かしたフォルダに合わせて相対パスを変更しましょう。 例えば、リポジトリの中に MyGame というフォルダを作り、その中にUnityプロジェクトを入れた場合は、.gitignore の記述も MyGame/[Ll]ibrary/ のように書き換えるか、MyGame フォルダの中に .gitignore を移動させる必要があります。
LFSを入れてないのに、重すぎるファイルを上げようとしている
GitHubには「1ファイル 100MB」という厳しい制限があります。高画質な動画や巨大な3Dモデル、あるいは数GBに膨らんだ Library 内のキャッシュファイルは、通常のアップロードでは弾かれます。 もし 100MB を超える「どうしても必要な素材」がある場合は、Git LFS (Large File Storage) を導入して、大きなファイルだけを専用のストレージに逃がす設定が必要です。
重すぎるファイルがいくつかある
.gitignoreに重すぎるファイルの拡張子を追加しましょう。例えば、下記のように書くと良い感じです。
*.mp4 # *は任意の文字列にマッチするワイルドカードです。この場合、すべての.mp4ファイルを無視します。
*.png
こうするとgithub上には.gitignoreに適応したデータは保存されなくなってしまうので、ギガファイル便やdriveで共有するなどするとよいです。
データを短期間に大量に送りすぎた
github上にデータを短期間に大量に送りすぎてしまうと、下記のようなメッセージが表示され受け取ってもらえません。素直に時間をおいてから送りなおしましょう。
Uploading LFS objects: 0% (0/10), 0 B | 0 B/s
batch response: Rate limit exceeded
error: failed to push some refs to 'https://github.com/user/repo.git'
おわりに
いかがでしたでしょうか。今回は、githubでファイルが重すぎてgithub側に拒否された場合の対処法をまとめてみました。もしよろしければ、他にも様々な記事を書いているので興味があったらそちらも見ていただけると幸いです。
ここまで読んでくれてありがとうございました。
Discussion