【自主学習の記録 part2】Git LFSの使い方

#LFSとは
GitにおけるLFSとはLarge File Storageの略で、通常であればGitで取り扱うことができない1GB以上の大きなファイルや画像や動画ファイル等のバイナリファイルを管理する事が出来る様になる機能です。
LFSを有効化する事により通常のGit系で扱えない上記ファイルも対応できます。
仕組みとして、LFS管理対象のファイルはプロジェクトとは別の専用ディレクトリに格納され、元のプロジェクト内にはそのファイルへのポインタが格納されるとの事です。
ポインタはwindowsで言うところのショートカットのようなものです。

#GitLabでLFSを使用する為の準備
GitLabでもLFSを使用する事が出来るので、有効化して試してみたいと思います。
##サーバー側の設定
GitLabでLFSを使用するためには、GitLabの設定ファイルを編集し、LFSを有効化する必要があります。
サーバーにCLIでログインし、GitLabの設定ファイル```/etc/gitlab/gitlab.rb```の中身をlfsで絞ってみると、LFS関連の設定がコメントアウトされていました。
以下はgitlab.rbファイルをlfsでグレップした結果の一部です。

```
cat /etc/gitlab/gitlab.rb | grep lfs
# gitlab_rails['lfs_enabled'] = true
# gitlab_rails['lfs_storage_path'] = "/var/opt/gitlab/gitlab-rails/shared/lfs-objects"
```

「lfs_enabled」がLFSの有効化となり、「lfs_storage_path」がLFSの管理対象ファイルの元ファイルを格納するディレクトリ設定の様です。
この2点を有効化してみたいと思います。
以下は設定後のgitlab.rbファイルをlfsでグレップした結果の一部です。

```
cat /etc/gitlab/gitlab.rb | grep lfs
gitlab_rails['lfs_enabled'] = true
gitlab_rails['lfs_storage_path'] = "/var/opt/gitlab/gitlab-rails/shared/lfs-objects"
```

なお、デフォルトで記載されていたlfs_storage_pathのパスは存在していましたので、特に変更はしていません。
パスが存在しない場合はエラーが返ってきますが、以下の結果の通りエラーは返ってきていませんでした。
実際に運用する場合、大きなファイルを管理する訳ですから専用のストレージを用意し、そのパスを```lfs_storage_paht```に記載するのだと思います。

```
ll /var/opt/gitlab/gitlab-rails/shared/lfs-objects
合計 0
```
設定が完了しましたので、GitLabのサービスを再起動します。
以下のコマンド投入後、```gitlab Reconfigured!```と表示されれば設定完了です。

```
gitlab-ctl reconfigure
```

参考サイト様
https://takuya-1st.hatenablog.jp/entry/2018/09/07/102058

##クライアント側の設定
上記でGitLabのサーバー側の設定を行いましたが、LFSを使用するにはクライアント側も設定が必要となります。
まずはGitBashにて以下のコマンドを実行します。

```
git lfs install
```

以下画像の様な結果が返ってきましたら完了です。
![GitLab01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/565eef3c-6325-3588-f648-965c29e166d3.png)


上記コマンドにより最低限クライアントからLFSが有効化されました。
次は実際にGitLabのプロジェクト上に画像ファイルをPushしてみたいと思います。
その前にLFSでファイルを管理する場合は、管理対象ファイルの拡張子を登録する必要があります。
拡張子を登録するコマンドは以下です。

```
git lfs track "*.＜拡張子＞"
```

今回はPNGファイルを使用したいと思いますので、実際のコマンドは以下の通りとなります。

```
git lfs track "*.png"
```

以下がコマンド投入の結果です。
なお、デフォルトのカレントディレクトリが正しくないので、事前に前回使用した作業ディレクトリへ移動しています。
![GitLab02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/f485975f-5265-2ed4-75db-69aa26607e81.png)
以上で事前準備は完了です。
ちなみに上記設定を投入後、カレントディレクトリ内に```.gitattributes```というファイルが作成されます。
中身は以下の通りとなっています。
先程追加したLFS管理対象ファイルの拡張子のエントリが記載されているようです。
![GitLab03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/aa4fde37-7267-f7a6-b015-e4f3a698b818.png)


##LFSを試す
事前準備が完了しましたので、実際にLFSを使用した状態でGitLabプロジェクトへPushしてみたいと思います。
LFSで管理するファイルはこの記事に貼り付けしたファイルを使用します。ファイル名は「GitLab01.png」です。
![GitLab04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/40521541-4158-63dc-061b-e97553d0f430.png)
以下の通り追加した「GitLab01.png」ファイルをプッシュします。

![GitLab05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/0839277b-f5e8-e1b8-b369-6acb7174b051.png)
プッシュ実行時に、以下の青枠内の様にLFS関連と思われるメッセージが追加されていました。
LFS管理対象のオブジェクトをアップロードしたというメッセージの様です。
![GitLab06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/4a2c3e87-a25c-8f0b-6027-0d1c1e448b15.png)
プッシュ完了後にGitLabのプロジェクトへアクセスしました所、```LFS```というアイコンが表示されたPNGファイルが追加されていました。
LFS管理対象のファイルには分かりやすいようにファイル名の後ろに```LFS```というアイコンが表示される様になっているのですね。
![GitLab07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/683b04a8-96bd-d6b9-ac30-d1e0106bb8dc.png)

次にこのプロジェクトを新しくクローンしてみたいと思います。
クローン前にmasterブランチにマージを実行していますが、本記事では省略させて頂いております。
以下の通り新しいディレクトリを作成して移動しています。
![GitLab08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/ee9d5725-5e2a-f0db-fd50-7f7b135a99c6.png)
クローンを実施します。
特にLFSに関するメッセージは表示されていません。
![GitLab09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/d0c24896-0152-dbe9-4eae-8702e5e61dd3.png)
クローン後のファイルを確認したのですが、ここで異変に気づきました。
クローン前とクローン後でPNGファイルのファイルサイズが異なっていました。
上がクローン後のファイルサイズで、下がクローン前のファイルサイズとなります。
![GitLab10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/8ecd0c4f-6dd3-176d-0bde-dcf84fc83a58.png)
原因はLFSの管理対象ファイルの定義ファイルである```.gitattributes```ファイルをプッシュしていなかった事でした。
おそらく129バイトのGitLab01.pngファイルは元のPNGファイルではなく、PNGファイルの場所を示すポインタだと思われます。
LFSの定義ファイル```.gitattributes```ファイルをプッシュするため、一旦クローン元のディレクトリに移動します。
![GitLab11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/c1c9920b-3434-2dd5-d37b-e35f3aedc591.png)
その後、以下画像の要領で```.gitattributes```ファイルをプッシュしています。
![GitLab12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/c6184593-b370-9968-c0a7-2fcc633de8cb.png)
プッシュが完了すると、GitLabのプロジェクトページ上で以下のように```.gitattributes```ファイルが表示されました。
![GitLab13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/886973ec-7091-75ea-4be6-ce1c261a28b0.png)
GitLab上でdebugブランチからmasterブランチへマージを実施し、クローンする準備が完了しました。
以下、クローンを実施するためにディレクトリ移動しています。
![GitLab14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/ecdd3921-8de0-b444-6f36-4a631b9a9b2f.png)
それから再度クローンを実施してみた所、クローン前と同じファイルサイズのファイルがクローンされている事を確認できました。
![GitLab15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/b56b1b48-3fce-951b-1a6b-d1fefd56aa98.png)
以上でLFSについての学習は完了です。
ですが、LFSについて試してみたい事があるので、次回も引き続きLFSについて学習していきたいと思います。