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別のインストール方法です。
- Windows用のインストーラ をダウンロードします。
- Windows用のインストーラを実行します。
git lfs install
を実行します。
brew update
を実行します。brew install git-lfs
を実行します。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