GitHubハンズオン 第6回 ～巨大ファイル編～

# GitHubハンズオン 第6回 ～巨大ファイル編～


本記事は、GitHubハンズオンの第6回の資料です！
過去の記事を読んでいることを前提としていますので、ご注意ください。


##### GitHubハンズオンシリーズ

- [GitHubハンズオン 第1回 〜個人開発編〜](https://qiita.com/segur/items/601277fbbe8cfa08678b)
- [GitHubハンズオン 第2回 〜共同開発編〜](https://qiita.com/segur/items/a3f7b9063829850391c5)
- [GitHubハンズオン 第3回 ～ブランチ運用法編～](https://qiita.com/segur/items/1dd578003da46bddc117)
- [GitHubハンズオン 第4回 ～いろいろ取り消し編～](https://qiita.com/segur/items/8ce6914af5578c5f4ce2)
- [GitHubハンズオン 第5回 ～無視リスト編～](https://qiita.com/segur/items/2de61acfa73ce1eceac9)
- GitHubハンズオン 第6回 ～巨大ファイル編～ ← 本記事


# LFSにファイルを登録する


## LFSとは

100MBを超えるファイルを、サーバーへプッシュしようとするとエラーになります。

そのエラーをでないようにする仕組みがLFSです。

LFSは `Large File System` の略で、巨大ファイル用システムという意味です。


## 新しいリポジトリを作る

ハンズオンを円滑に進めるため、GitHubで新しいリポジトリを作ります。


![image39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/382c83a8-0366-80a1-13e4-4473e55ef3f3.png)


* `Owner` : ご自身の個人アカウント
* `Repository name` : `LfsPractice`
* `Private` を選択
    * `Public` を選ばないようにしてください。

としてください。

これをクローンして、Forkでローカルリポジトリを開いてください。

コミットが1つもないと、この後の作業がやりづらいので、 `README.md` 等を作成してコミットしてください。


## 巨大ファイルを設置する

[Sample101MB.bin](https://drive.google.com/file/d/1EAJRss_iCRA5mM1sWX8MYj0pE16O4fkr/view?usp=share_link) をダウンロードしてください。

ちょうど101MBのファイルです。中身は意味のないデータが詰まっています。

（segurが適当に生成したファイルなので、ご自由にお使いください！）

これを、作業ディレクトリに設置してください。

これをコミットして、プッシュしようとすると、以下のようなエラーがでます。


![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/98fbdced-99ed-ffaf-077f-ac2f30607b83.png)


> _remote: error: File Sample101MB.bin is 101.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._

要約すると、以下のような感じです。


> 100MBを超えている巨大ファイルを検知しました。
> LFSを利用してください。

巨大ファイルをコミットした1つ前の状態まで、 **Mixed Reset** してください。
（`Mixed Reset` が何かわからない方は、 [第4回](https://qiita.com/segur/items/8ce6914af5578c5f4ce2#%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88) をお読みください。）


## LFSを有効にする

**Repository > Git LFS > Initialize Git LFS** を実行してください。


![image37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/bc90ad47-513e-1541-28e6-83a820182eac.png)


**この作業はリポジトリ毎に必要となります！**

`Initialize Git LFS` が見つからない場合は、すでにLFSが有効になっています！


## 巨大ファイルを設置する

`Sample101MB.bin` を **右クリック > LFS > Track ‘Sample101MB.bin’** をクリックします。


![image9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/9ce450e3-82fe-b66c-93c2-41c632726005.png)


すると、 `.gitattributes` というファイルが生成されます。


![image19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/c3988925-0077-0b7c-4478-1c328a009ab9.png)


`.gitattributes` というのは、LFSの設定ファイルです。

中身を見ると、 `Sample101MB.bin` が登録されていることがわかります。


![image21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/a29d873f-7150-6381-5943-fa0f22332cea.png)


この `.gitattributes` のみをまずコミットしてください。

その次に、 `Sample101MB.bin` をコミットしてください。

**`Sample101MB.bin` を `.gitattributes` よりも先にコミットしないようにご注意ください。**

`Sample101MB.bin` と `.gitattributes` を同時にコミットするのは問題ありません。


## プッシュする

再びプッシュをしてみます。

今度は、問題なくプッシュできます！


# LFSに登録されているファイルを確認する


## リポジトリに登録されているLFSファイルを確認する

Forkの右上から **Open in > View on GitHub** で、リモートリポジトリのページを開きます。


![image17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/f2005311-ab25-1cde-dad4-9377f76c15e4.png)


`Sample101MB.bin` をクリックします。


![image7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/34e004ac-c619-f296-bc3d-ef8100d18c54.png)


**Stored with Git LFS** と表記されています。

これは、このファイルがLFSに登録されているという証です！


![image38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/7326a79d-84ee-b071-1fc6-7638ff2daf3b.png)


## LFSを利用しているリポジトリ一覧を確認する

GitHub右上の **Settings** をクリックします。


![image26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/ced0e4be-4591-81f4-e778-a3d17a675dc2.png)


左サイドバーの **Billing and plans > Plans and usage** をクリックします。


![image33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/409f6c04-5a1d-5249-a5e7-2a33c036bd77.png)

下の方にスクロールして、 **Git LFS Data > Storage** をクリックします。


![image15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/6df5a1a5-49f8-d808-33af-90d0e5b05023.png)


すると、LFSを利用しているリポジトリの一覧が表示されました！

無料プランの場合、合計1GBまで利用できます。

課金している場合1GB以上利用できますが、費用を抑えるためにも、巨大ファイルを大量に登録しないようにしましょう！


# LFSからファイルを削除したい

GitHubのコストを削減するためにも、不要なファイルは削除すべきです。

しかし、LFSファイルの削除は、実はとても大変です。


## LFSからファイルを削除する

以下の作業が必要になります。


* コミットの履歴を改ざんし、巨大ファイルのコミットをなかったことにする。
* リポジトリのLFS機能を無効にする。
* リポジトリを削除して再作成する。

詳しい手順はこちらを参照してください。

[ファイルを Git Large File Storage から削除する - GitHub Docs](https://docs.github.com/ja/repositories/working-with-files/managing-large-files/removing-files-from-git-large-file-storage)

かなり複雑で難解な操作になるため、今回のハンズオンでは実施しません。すみません。


## リポジトリを削除する

今回のハンズオンでは、リポジトリを削除することで、LFSも削除します。

`LfsPractice` リポジトリを削除しましょう！

GitHubのリポジトリのページの右上にある **Settings** をクリックします。


![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/f2237e06-5cf1-3932-d36e-bc39150133af.png)


一番下までスクロールし、 **Danger Zone > Delete this repository** をクリックします。


![image34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/fda13037-c9b0-3b9b-dcb5-68214617af27.png)


以下のようなダイアログが表示されます。


![image10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/45e5242a-049a-ae03-b300-116b6bd938b4.png)


表示にしたがって進めると、以下のような画面になります。

リポジトリの名前をタイプして `Delete this repository` をクリックします。


![image8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/4a3c5fc8-4f18-21ba-f158-d012463e1c05.png)


GitHubのパスワードの入力を求められるので、入力します。

リポジトリ一覧ページに遷移したら、削除成功です！

改めて、 [Billing](https://github.com/settings/billing) を確認すると、 **Git LFS Data > Storage** から `LfsPractice` が消えているはずです！


# さいごに

本記事作成にあたり、以下の記事を参考にさせていただきました。ありがとうございました！

- [ファイルを Git Large File Storage から削除する - GitHub Docs](https://docs.github.com/ja/repositories/working-with-files/managing-large-files/removing-files-from-git-large-file-storage)

これで、GitHubハンズオンは終了です！

ここまですべて実践いただいた方！
もうGitHubもForkも怖くありませんよね！

みなさまのお役に立てたなら幸いです！

これも何かのご縁ですので、 [Twitter](https://twitter.com/segur_vita) などフォローしていただけるととても嬉しいです！
（普段は、VR・ARに関する発信が多めですが、それでも構わなければ！）

以上、おつかれさまでした！