Git LFSの使用方法

Git LFSとは

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

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

LFSでは、大きなファイルをより効率的に扱うことができます。例えば、Gitのパフォーマンスを維持するには、リポジトリのサイズを1GB以下に抑えることが推奨されています。LFSを使用すると、この推奨サイズを守りやすくなります。

Gitの使用可能なバージョンについて詳しくは、動作環境を参照してください。

LFSのインストール

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

LFSをインストールする手順について説明します。

  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へプッシュする

対象のファイルを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

ファイルパターン削除時の注意事項

git lfs untrackのコマンド実行は、今後LFSで管理するファイルのパターンを変更するためのものです。そのため、すでにLFSに保存されているファイルはGitの履歴に残り続けており、スペースの容量にも引き続き含まれます。スペースの容量を削減したい場合は、リポジトリを削除して再作成してください。

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