GitLab Git Large File Storage (LFS) の管理
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab Self-Managed
Gitリポジトリのサイズを大きくしたり、パフォーマンスに影響を与えたりすることなく、大きなファイルを保存するには、Git Large File Storage (LFS) を使用します。LFSを有効または無効にしたり、LFSオブジェクトのローカルまたはリモートストレージを設定したり、ストレージタイプ間でオブジェクトを移行することができます。
Git LFSに関するユーザー向けドキュメントは、Git Large File Storageを参照してください。
前提要件:
- ユーザーは、Git LFS clientバージョン1.1.0以降、または1.0.2をインストールする必要があります。
LFSを有効または無効にする
LFSはデフォルトで有効になっています。無効にするには、次の手順に従います:
/etc/gitlab/gitlab.rbを編集します:# Change to true to enable lfs - enabled by default if not defined gitlab_rails['lfs_enabled'] = falseファイルを保存して、GitLabを再設定します:
sudo gitlab-ctl reconfigure
Helmの値をエクスポートします:
helm get values gitlab > gitlab_values.yamlgitlab_values.yamlを編集します:global: appConfig: lfs: enabled: falseファイルを保存して、新しい値を適用します:
helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
docker-compose.ymlを編集します:version: "3.6" services: gitlab: environment: GITLAB_OMNIBUS_CONFIG: | gitlab_rails['lfs_enabled'] = falseファイルを保存して、GitLabを再起動します:
docker compose up -d
/home/git/gitlab/config/gitlab.ymlを編集します:production: &base lfs: enabled: falseファイルを保存して、GitLabを再起動します:
# For systems running systemd sudo systemctl restart gitlab.target # For systems running SysV init sudo service gitlab restart
ローカルストレージパスの変更
Git LFSオブジェクトはサイズが大きくなる可能性があります。デフォルトでは、GitLabがインストールされているサーバーに保存されます。
Dockerインストールの場合、データがマウントされるパスを変更できます。Helmチャートの場合は、オブジェクトストレージを使用します。
デフォルトのローカルストレージパスの場所を変更するには、次の手順に従います:
/etc/gitlab/gitlab.rbを編集します:# /var/opt/gitlab/gitlab-rails/shared/lfs-objects by default. gitlab_rails['lfs_storage_path'] = "/mnt/storage/lfs-objects"ファイルを保存して、GitLabを再設定します:
sudo gitlab-ctl reconfigure
/home/git/gitlab/config/gitlab.ymlを編集します:# /home/git/gitlab/shared/lfs-objects by default. production: &base lfs: storage_path: /mnt/storage/lfs-objectsファイルを保存して、GitLabを再起動します:
# For systems running systemd sudo systemctl restart gitlab.target # For systems running SysV init sudo service gitlab restart
リモートオブジェクトストレージへのLFSオブジェクトの格納
LFSオブジェクトをオブジェクトストレージに格納できます。これにより、ローカルディスクへの読み取りと書き込みを削減し、ディスク容量を大幅に解放できます。
統合されたオブジェクトストレージ設定を使用する必要があります。
オブジェクトストレージに移行する
LFSオブジェクトをローカルストレージからオブジェクトストレージに移行できます。この処理はバックグラウンドで実行され、ダウンタイムは不要です。
オブジェクトストレージを設定します。
LFSオブジェクトを移行します:
sudo gitlab-rake gitlab:lfs:migratesudo docker exec -t <container name> gitlab-rake gitlab:lfs:migratesudo -u git -H bundle exec rake gitlab:lfs:migrate RAILS_ENV=productionオプション。SQLコンソールを使用して、進行状況を追跡し、すべてのLFSオブジェクトが正常に移行したことを確認します。
PostgreSQLコンソールを開きます:
sudo gitlab-psqlsudo docker exec -it <container_name> /bin/bash gitlab-psqlsudo -u git -H psql -d gitlabhq_production次のSQLクエリを使用して、すべてのLFSファイルをオブジェクトストレージに移行したことを確認します。
objectstgの数がtotalと同じである必要があります:gitlabhq_production=# SELECT count(*) AS total, sum(case when file_store = '1' then 1 else 0 end) AS filesystem, sum(case when file_store = '2' then 1 else 0 end) AS objectstg FROM lfs_objects; total | filesystem | objectstg ------+------------+----------- 2409 | 0 | 2409
ディスク上の
lfs-objectsディレクトリにファイルがないことを確認します:sudo find /var/opt/gitlab/gitlab-rails/shared/lfs-objects -type f | grep -v tmp | wc -l/var/opt/gitlabを/srv/gitlabにマウントしている場合は、次のようになります:sudo find /srv/gitlab/gitlab-rails/shared/lfs-objects -type f | grep -v tmp | wc -lsudo find /home/git/gitlab/shared/lfs-objects -type f | grep -v tmp | wc -l
ローカルストレージへの移行の復元
Helmチャートの場合は、オブジェクトストレージを使用する必要があります。
ローカルストレージに移行して戻すには、次の手順に従います:
LFSオブジェクトを移行します:
sudo gitlab-rake gitlab:lfs:migrate_to_local/etc/gitlab/gitlab.rbを編集し、LFSオブジェクトのオブジェクトストレージを無効にします:gitlab_rails['object_store']['objects']['lfs']['enabled'] = falseファイルを保存して、GitLabを再設定します:
sudo gitlab-ctl reconfigure
LFSオブジェクトを移行します:
sudo docker exec -t <container name> gitlab-rake gitlab:lfs:migrate_to_localdocker-compose.ymlを編集し、LFSオブジェクトのオブジェクトストレージを無効にします:version: "3.6" services: gitlab: environment: GITLAB_OMNIBUS_CONFIG: | gitlab_rails['object_store']['objects']['lfs']['enabled'] = falseファイルを保存して、GitLabを再起動します:
docker compose up -d
LFSオブジェクトを移行します:
sudo -u git -H bundle exec rake gitlab:lfs:migrate_to_local RAILS_ENV=production/home/git/gitlab/config/gitlab.ymlを編集し、LFSオブジェクトのオブジェクトストレージを無効にします:production: &base object_store: objects: lfs: enabled: falseファイルを保存して、GitLabを再起動します:
# For systems running systemd sudo systemctl restart gitlab.target # For systems running SysV init sudo service gitlab restart
ピュアSSH転送プロトコル
この機能は、既知の問題 (Git LFS 3.6.0で解決済) の影響を受けます。ピュアSSHプロトコルを使用して複数のGit LFSオブジェクトを含むリポジトリをクローン作成すると、クライアントがnilポインター参照によってクラッシュする可能性があります。
git-lfs 3.0.0は、HTTPの代わりにSSHを転送プロトコルとして使用するためのサポートをリリースしました。SSHは、git-lfsコマンドラインツールによって透過的に処理されます。
ピュアSSHプロトコルのサポートが有効になっていて、gitがSSHを使用するように設定されている場合、すべてのLFS操作はSSH経由で行われます。たとえば、Git originがgit@gitlab.com:gitlab-org/gitlab.gitの場合などです。gitとgit-lfsが異なるプロトコルを使用するように設定することはできません。バージョン3.0以降、git-lfsは最初にピュアSSHプロトコルの使用を試み、サポートが有効になっていないか利用できない場合は、HTTPの使用にフォールバックします。
前提要件:
git-lfsバージョンは、v3.5.1以降である必要があります。
Git LFSがピュアSSHプロトコルを使用するように切り替えるには、次の手順に従います:
/etc/gitlab/gitlab.rbを編集します:gitlab_shell['lfs_pure_ssh_protocol'] = trueファイルを保存して、GitLabを再設定します:
sudo gitlab-ctl reconfigure
Helmの値をエクスポートします:
helm get values gitlab > gitlab_values.yamlgitlab_values.yamlを編集します:gitlab: gitlab-shell: config: lfs: pureSSHProtocol: trueファイルを保存して、新しい値を適用します:
helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
docker-compose.ymlを編集します:services: gitlab: environment: GITLAB_OMNIBUS_CONFIG: | gitlab_shell['lfs_pure_ssh_protocol'] = trueファイルを保存して、GitLabとそのサービスを再起動します:
docker compose up -d
/home/git/gitlab-shell/config.ymlを編集します:lfs: pure_ssh_protocol: trueファイルを保存して、GitLab Shellを再起動します:
# For systems running systemd sudo systemctl restart gitlab-shell.target # For systems running SysV init sudo service gitlab-shell restart
ストレージ統計
グループおよびプロジェクトごとのLFSオブジェクトの合計ストレージ使用量は、次の手段で確認できます:
ストレージ統計では、リンクしているすべてのプロジェクトについて、各LFSオブジェクトがカウントされます。
関連トピック
- ブログ投稿: Git LFS入門
- ユーザードキュメント: Git Large File Storage(LFS)
トラブルシューティング
見つからないLFSオブジェクト
見つからないLFSオブジェクトに関するエラーは、次のいずれかの状況で発生する可能性があります:
ディスクからオブジェクトストレージにLFSオブジェクトを移行するときに、次のようなエラーメッセージが表示される:
ERROR -- : Failed to transfer LFS object 006622269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7 with error: No such file or directory @ rb_sysopen - /var/opt/gitlab/gitlab-rails/shared/lfs-objects/00/66/22269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7(読みやすくするために改行を追加しました)。
VERBOSE=1パラメータを指定してLFSオブジェクトの整合性チェックを実行する場合。
データベースには、ディスク上にないLFSオブジェクトのレコードが含まれている可能性があります。データベースエントリは、オブジェクトの新しいコピーがプッシュされるのを防ぐ可能性があります。これらの参照を削除するには、次の手順に従います:
Railsコンソールを起動します。
Railsコンソールで見つからないとレポートされているオブジェクトをクエリして、ファイルパスを返します:
lfs_object = LfsObject.find_by(oid: '006622269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7') lfs_object.file.pathディスクまたはオブジェクトストレージに存在するかどうかを確認します:
ls -al /var/opt/gitlab/gitlab-rails/shared/lfs-objects/00/66/22269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7ファイルが存在しない場合は、Railsコンソールを使用してデータベースレコードを削除します:
# First delete the parent records and then destroy the record itself lfs_object.lfs_objects_projects.destroy_all lfs_object.destroy
複数の見つからないLFSオブジェクトを削除する
複数の見つからないLFSオブジェクトへの参照を一度に削除するには、次の手順に従います:
GitLab Railsコンソールを使用します。
次のスクリプトを実行します:
lfs_files_deleted = 0 LfsObject.find_each do |lfs_file| next if lfs_file.file.file.exists? lfs_files_deleted += 1 p "LFS file with ID #{lfs_file.id} and path #{lfs_file.file.path} is missing." # lfs_file.lfs_objects_projects.destroy_all # Uncomment to delete parent records # lfs_file.destroy # Uncomment to destroy the LFS object reference end p "Count of identified/destroyed invalid references: #{lfs_files_deleted}"
このスクリプトは、データベース内の見つからないすべてのLFSオブジェクトを識別します。レコードを削除する前に:
- 最初に、検証のために見つからないファイルに関する情報を出力します。
- コメント化された行は、誤った削除を防ぎます。コメントを解除すると、スクリプトは識別されたレコードを削除します。
- スクリプトは、比較のために削除されたレコードの最終カウントを自動的に出力します。
TLS v1.3サーバーでLFSコマンドが失敗する
GitLabを構成してTLS v1.2を無効にし、TLS v1.3接続のみを有効にする場合、LFS操作にはGit LFSクライアントバージョン2.11.0以降が必要です。バージョン2.11.0以前のGit LFSクライアントを使用すると、GitLabに次のエラーが表示されます:
batch response: Post https://username:***@gitlab.example.com/tool/releases.git/info/lfs/objects/batch: remote error: tls: protocol version not supported
error: failed to fetch some objects from 'https://username:[MASKED]@gitlab.example.com/tool/releases.git/info/lfs'TLS v1.3で構成されたGitLabサーバー上でGitLab CIを使用する場合、含まれているGitLab Runner Helper imageで更新されたGit LFSクライアントバージョンを受信するには、13.2.0以降にGitLab Runnerにアップグレードする必要があります。
インストールされているGit LFSクライアントのバージョンを確認するには、次のコマンドを実行します:
git lfs version`Connection refused` Connection refusedエラー
LFSオブジェクトをプッシュまたはミラーすると、次のようなエラーが表示される場合:
dial tcp <IP>:443: connect: connection refusedConnection refused - connect(2) for \"<target-or-proxy-IP>\" port 443
ファイアウォールまたはプロキシルールが接続を終了している可能性があります。
標準のUnixツールまたは手動のGitプッシュを使用した接続チェックが成功した場合、ルールはリクエストのサイズに関連している可能性があります。
PDFファイルの表示エラー
LFSがオブジェクトストレージで構成され、proxy_downloadがfalseに設定されている場合、WebブラウザーからPDFファイルをプレビューすると、エラーが表示されることがあります:
An error occurred while loading the file. Please try again later.これは、クロスオリジンリソース共有 (CORS) の制限が原因で発生します: ブラウザがオブジェクトストレージからPDFファイルを読み込むことを試みますが、オブジェクトストレージプロバイダーは、GitLabドメインがオブジェクトストレージドメインと異なるため、リクエストを拒否します。
この問題を解決するには、オブジェクトストレージプロバイダーのCORS設定を構成して、GitLabドメインを許可します。詳細については、次のドキュメントを参照してください:
Forking in progressメッセージでフォーク操作が停止する
複数のLFSファイルを含むプロジェクトをフォークしている場合、操作がForking in progressメッセージで停止する可能性があります。これが発生した場合は、次の手順に従って問題を診断し、解決してください:
次のエラーメッセージについて、exceptions_json.logファイルを確認してください:
"error_message": "Unable to fork project 12345 for repository @hashed/11/22/encoded-path -> @hashed/33/44/encoded-new-path: Source project has too many LFS objects"このエラーは、イシュー#476693で説明されているように、LFSファイルのデフォルト制限である100,000に達したことを示しています。
GITLAB_LFS_MAX_OID_TO_FETCH変数の値を大きくします:設定ファイル
/etc/gitlab/gitlab.rbを開きます。変数を追加または更新します:
gitlab_rails['env'] = { "GITLAB_LFS_MAX_OID_TO_FETCH" => "NEW_VALUE" }要件に基づいて
NEW_VALUEを数値に置き換えます。
変更を適用します。以下を実行します:
sudo gitlab-ctl reconfigure詳細については、Linuxパッケージインストールの再構成を参照してください。
フォーク操作を繰り返します。
GitLab Helmチャートの場合、extraEnvを使用して環境変数GITLAB_LFS_MAX_OID_TO_FETCHを設定します。