Git LFSの使用方法

Git LFSとは

Gitは、音声、動画、高画質な画像などの大きなファイルを扱うことはあまり得意ではありません。Gitリポジトリにそのような大きなファイルを含めると、git clone、git push、git pullの処理に膨大な時間がかかる場合があります。

Git LFS(Large File Storage 以下、LFS) は、前述した問題を解決すべく、GitHub、Microsoft、Atlassian、および他のコントリビュータによって開発されているGitの拡張機能です。これにより、大きなファイルをより効率的に扱うことができるようになります。

Gitの使用可能なバージョンはこちらをご確認ください。

大きなファイルを必要な分だけダウンロードする

例えば、LFSで管理したファイルは、git clone、git pullの時ではなく、git checkoutのタイミングで必要な分だけダウンロードされます。

大きなファイルの実態を分けて管理する

さらに、ユーザのリモートリポジトリにはLFSで管理しているファイルの実態はなく、代わりにファイルのメタ情報のみを保持します。メタ情報は、LFSサーバに実体を問い合わせるための情報を格納した数百バイトのテキストファイルです。

これにより、Gitのパフォーマンスを維持するための一般的な推奨事項として上げられる、Gitリポジトリのサイズを1GB以下に抑えやすくなります。

LFSのインストール

LFSはGitコマンドの拡張プラグインとして提供されているため、LFSのパッケージをダウンロードした後、インストールする必要があります。

以下はOS別のインストール方法です。

  1. Windows用のインストーラをダウンロードします。
  2. Windows用のインストーラを実行します。
  3. git lfs installを実行します。
  1. brew updateを実行します。
  2. brew install git-lfsを実行します。
  3. git lfs installを実行します。

LFSの基本的な使い方

LFSでファイルを管理するには、使用する各リポジトリで対象のファイルを設定する必要があります。

ここでは、LFSの基本的な使い方を解説します。

LFSで管理するファイルのパターンを追加する

LFSを使用するリポジトリで、以下のコマンドを実行します。

$ git lfs track [<パターン>...]

パターンに様々な条件を記述して、LFSで管理するファイルを一致させることができます。

以下のパターンは、特定のファイルだけを指定する例です。

$ git lfs track "foo/bar/baz.png"

以下のパターンは、特定のディレクトリ内のファイルを一括で指定する例です。

$ git lfs track "foo/bar/*"

以下のパターンは、特定の拡張子のファイルを一括で指定する例です。

$ git lfs track "*.png"

また、以下のコマンドで、設定したすべてのパターンを表示できます。

$ git lfs track
Listing tracked patterns
foo/bar/baz.png (.gitattributes)
foo/bar/* (.gitattributes)
*.png (.gitattributes)

さらに、これらの設定は以下のとおり.gitattributesファイルに保持されています。

foo/bar/baz.png filter=lfs diff=lfs merge=lfs -text
foo/bar/* filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text

この.gitattributesファイルを、以下のとおりgit pushすることで、LFSの設定を他のメンバーに共有できます。

$ git add .gitattributes
$ git commit -m "add git lfs attributes"
$ git push

 LFSで管理するファイルをBacklogへプッシュする

前述のLFSで管理するファイルのパターンを追加するで、必要な設定は完了しています。以下のとおり、対象のファイルをgit pushすれば、自動的にLFSのファイルとしてアップロードされます。

$ git add example.png
$ git commit -m "add git lfs file"
$ git push

SSHプロトコルでgit cloneやgit pushする場合は、LFSのURLを明示的に設定するために、以下のコマンドを実行してください。HTTPプロトコルの場合は必要ありません。

$ git config -f .lfsconfig lfs.url https://{スペースのドメイン}/git/{プロジェクトキー}/{リポジトリ名}.git/info/lfs

例:

$ git config -f .lfsconfig lfs.url https://foo.backlog.com/git/BAR/baz.git/info/lfs

以下のとおり、LFSのベースのエンドポイントが.lfsconfigファイルに追加されます。

[lfs]
url = https://foo.backlog.com/git/BAR/baz.git/info/lfs

この.lfsconfigファイルを、以下のとおりgit pushすることで、LFSの設定を他のメンバーに共有できます。

$ git add .lfsconfig
$ git commit -m "add git lfs config"
$ git push

これで、BacklogのGitのファイル画面に対象のファイルが追加されます。

求められるユーザ名とパスワードは、HTTPプロトコルでgit cloneやgit pushするときに入力するものと同じです。

LFSで管理するファイルをBacklog上で閲覧する

LFSで管理しているファイルは、BacklogのGitリポジトリのファイル画面から閲覧できます。

画像ファイル:

画像ファイル以外:

また、バイナリファイル以外は、画面上部の「内容をそのまま表示する」を押下すると、ブラウザ上で内容を表示できます。

LFSで管理するファイルのパターンを削除する

LFSで管理しているファイルのパターンを削除する場合、以下のコマンドを実行します。

$ git lfs untrack "foo/bar/baz.png"

以下のとおり、.gitattributesから対象のパターンが削除されます。

foo/bar/* filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text

この.gitattributesファイルを、以下のとおりgit pushすることで、LFSの設定を他のメンバーに共有できます。

$ git add .gitattributes
$ git commit -m "update git lfs attributes"
$ git push

LFSのファイルロック機能の使い方

LFSで管理されているファイルは同時に編集すると、基本的に競合が発生します。ファイルロック機能を使用すると、開発者は更新中のファイルをロックして、他のユーザが同時に更新することを防げます。

ここでは、LFSのファイルロック機能の使い方を解説します。

ロック可能なファイルの種類を設定する

ファイルロック機能を使用する最初の手順は、ロック可能なファイルの種類を定義することです。以下のコマンドで、リポジトリ内のfoo/bar/ディレクトリ以下の全ファイルをロック可能と設定します。

$ git lfs track "foo/bar/*" --lockable

これにより.gitattributesファイルに以下の行が追加されます。

foo/bar/* filter=lfs diff=lfs merge=lfs -text lockable

.gitattributesファイル内のパターンにlockableが追記されることで、対象のパターンに一致するファイルがロック可能になります。Git LFSはローカルファイルシステム上でそれらを自動的に読み取り専用にします。

ファイルをロックする

前述のロック可能なファイルの種類を設定するで、対象のパターンに一致するファイルを読み取り専用にしました。これにより、ユーザがファイルを最初にロックせずに誤って編集することを防ぎます。

それらのファイルを編集するには、対象のファイルをロックする、すなわち、対象のファイルを編集する権限を取得する必要があります。

以下のコマンドで、foo/bar/example.pngファイルをロックすることで、ファイルに書き込み権限が付与され編集できるようになります。

$ git lfs lock foo/bar/example.png

ロック中のファイル一覧を取得する

リポジトリ内のロック中のファイルは、以下のコマンドで一覧表示できます。

$ git lfs locks
foo/bar/example.png    Jane ID:123
foo/bar/baz.png    Mike ID:123

ファイルのロックを解除する

対象のファイルの書き込み権限が必要なくなった場合は、以下のコマンドにパスまたはIDを渡すことでロックを削除できます。

$ git lfs unlock foo/bar/example.png
$ git lfs unlock --id=123

また、以下のとおり --force フラグを使用して、他の人のファイルのロックを強制的に解除すること可能です。

$ git lfs unlock foo/bar/baz.png --force