fetchが遅すぎる。いうような状態になり、やっぱりアセットをgitで管理するのは無理があるよねとなりました。今から別のツールに移行するのも結構辛い。いう事で、gitを使いつつ、もっと簡単にアセット管理をできる仕組みを考えてみました。こんなのを作ることにしたクライアント-アセットの対応情報を取得できるクライアントとアセットの整合性が取れていなければ、動かない可能性があります。そのため、自分が開発しているクライアントに対応するアセットがどれかを知る必要があります。それを保存するためにDBとかを準備するのが面倒なので、gitレポジトリの中に保存してしまうことにしました。この情報のみ頻繁にfetchするようにします。特定のplatform用のアセットです。そのため、上記の対応情報でわかったアセットだけを取得します。履歴はfetchしません。加えて、必要なplatformのディレクトリだけfetchする形にしました。これによって、実際のアセットを取得する際も、それほど時間をかけずに取得できます。全体像を書くとこんな感じです。アセット管理の流れこれで、fetchが重いとかローカルの容量が大きくなりすぎるといった問題を回避できそうです。これらをどうやってgit上で行っているかを説明するために、gitの内部構造について軽く触れておきます。10「Gitの内側」を読むと、Gitの中でどのように変更履歴やディレクトリ構造が保存されているのかがよくわかります。要点をまとめると以下になります。objectのグラフで表現されている。objectには、ディレクトリ中にある、ディレクトリ名やファイル名が保存される。objectには、ファイルのコンテンツが保存される。dir1/hello、dir1/world、file2と3つのファイルが保存されている場合、以下の様に保存されることになります。gitの構造クライアント-アセットの対応情報を取得するgitの内部がこのような形であると分かれば、レポジトリに保存されているディレクトリ構造と関係なく、データを保存して置けることがわかります。objectを作成することが出来ます。tree構造を作ってしまえば、gitのコマンドを使って簡単に保存した値を取得することができます。storeとしてgitレポジトリを利用することができるわけです。以下、bashでこの操作をやるとこんな感じです。.gitディレクトリで実行。.gitディレクトリで実行。指定したレコードが既にあればそれをindexに読み込む。keyをファイル名としてindexに登録。objesctを作成する。objectを紐付ける。$VALUE}この中に、clientレポジトリのコミットと、それに対応する必要最小限のアセットを指定するコミットを紐づけるデータを保存しておきます。1つのレコードには、以下の情報を登録しておきました。androidのアセットだけ取得するためのコミット次に、iphone/androidだけを取得するコミットをどうやって作るかを説明します。必要最小限のアセットだけfetchする私の案件では、platform毎にディレクトリが分けられ、アセットが保存されていました。そのため、必要最小限のアセットだけをfetchするためには、特定のディレクトリだけfetchする方法が必要です。それを実現するために、clone/fetchするobjectがどのようにして選ばれるかを調べ、利用しました。objectから辿れる全てのオブジェクトを取得します。cloneを実行すると、図3のように、履歴をたどらずに取得することができます。objectとから辿ることが出来る範囲にしぼられることが分かります。objectを作ってやり、それをcloneの対象として指定すればよいことになります。cloneする時の図(赤黄緑だけcloneする)以下、bashでこの操作をやるとこんな感じです。clone元レポジトリで事前にやっておくこと。objectを、クライアントのコードに対応するアセットとして情報を持っておけば、必要最小限のアセットを取得することができるようになります。まとめgitの構造を利用してやることで、ファイル数が多すぎて重いレポジトリでも、負荷なく使える環境を作ることができました。今後、もう少し汎用的なツールにまとめていきたいです。