gitignoreを理解してUnityプロジェクトを正しくCleanする方法
結論
$ git reset --hard ※追跡ファイルの差分を強制リセット
した後、
自分の消したい内容によって、下記3つの内のどれか選択
(1)
$ git clean -fd ※gitignore設定していない未追跡ファイルが削除対象
(2)
$ git clean -fdX ※gitignore設定した未追跡ファイルのみ削除対象
(3)
$ git clean -fdx ※未追跡ファイルはすべて削除対象
背景
Unityプロジェクトで作業中、操作を誤って意図しないファイルが大量生成された。Cleanな状態に戻したい時、いつも'git clean -fdx'とやっていたが、gitignoreしてるファイル(Library)も削除されてしまったのでUnity再起動時にやたらと時間がかかってしまった。
ちゃんとこれらの関係を理解しておくべき。
gitignoreとは
git上で意図的に追跡対象から外したい(無視したい)ファイルを設定するための設定ファイル。UnityだとLibraryフォルダやTempフォルダは基本的には追跡対象から外す。
何のために?
差分履歴を残しておくべきファイルとそうでないファイルがあるため。
※例えば開発者個人のローカル設定ファイルなどを追跡対象として、リモートリポジトリにPUSHされてしまうと他の共同開発者が困ってしまうため。
Unityのgitignoreはどうやって書くの?
https://github.com/github/gitignore/blob/master/Unity.gitignore
Unity向けGitignoreの最新版はGithubから取得可能
Github上で自分の新規リポジトリ作成時にgitignoreのUnityテンプレが作成可能だった。便利。
各コマンドの実行結果
前提
基本gitignoreはUnityのテンプレを使用するが、分かりやすくするためLibraryのみの状態で考える。(プロジェクトはCleanな状態)
.gitignoreの中身
$ cat .gitignore
/Library/
Library以下に適当なhoge_1.txtを追加
$ echo hoge1 > Library/hoge_1.txt
Assets以下に適当なhoge_2.txtを追加
$ echo hoge2 > Assets/hoge_2.txt
コマンド実行
$ git clean -fd
※Assets/hoge_2.txt が削除される
$ git clean -fdX
※Library/hoge_1.txt が削除される
$ git clean -fdx
※Library/hoge_1.txt が削除される
※Assets/hoge_2.txt が削除される
消されるファイルを事前に確認するオプション
消す前に何が消えるのか確認したい場合はfオプションをnに変えると
何のファイルが削除されるか事前に確認できる。問題なければfに戻す。
$ git clean -nd
Would remove Assets/hoge_2.txt
$ git clean -ndX
Would remove Library/hoge_1.txt
$ git clean -ndx
Would remove Assets/hoge_2.txt
Would remove Library/hoge_1.txt
Library以下のファイルは初回起動時などにいろいろ自動生成される。
'git clean -fdx'をしてもいいけどLibraryを削除してしまうとUnity起動時にまたLibrary自動生成が走り、時間がかかってしまうというお話。
そのため、gitignore設定している未追跡ファイル(Library)を消したくない状況で、元のまっさらな状態(HEAD)に戻したい時は、
$ git reset --hard
$ git clean -fd
を使っていく場面が多いと思われる。
git cleanのオプション解説
-n:削除予定のファイルを確認
-f:強制削除実行
-d:ディレクトリも削除対象に含む
-x:gitignore設定したファイル含めて削除
-X:gitignore設定したファイルのみ削除