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