Rakeタスクのプロジェクトインポートとエクスポート

GitLabはプロジェクトのインポートとエクスポートのためのRakeタスクを提供します。

互換性のあるGitLabインスタンスからのみインポートできます。

大規模プロジェクトのインポート

RakeタスクはGitLab.comのRubyスクリプトの代わりにGitLab 12.6で導入されました。

このスクリプトはGitLab 12.6で大規模なGitLabプロジェクトのエクスポートをインポートするために導入されました。

このスクリプトの一部として、直接アップロードも無効にしています。こうすることで、巨大なアーカイブをGCSにアップロードすることを避けることができます。

このスクリプトはターミナルから実行できます:

パラメータを指定します:

属性種類必須説明
username文字列です。yesユーザー名
namespace_path文字列です。yes名前空間パス
project_path文字列です。yesプロジェクトパス
archive_path文字列です。yesインポートしたいエクスポートプロジェクトtarボールのパス
bundle exec rake "gitlab:import_export:import[root, group/subgroup, testingprojectimport, /path/to/file.tar.gz]"

Linuxパッケージインストールを実行している場合、以下のRakeタスクを実行してください:

gitlab-rake "gitlab:import_export:import[root, group/subgroup, testingprojectimport, /path/to/file.tar.gz]"

大規模プロジェクトのエクスポート

GitLab 12.9で導入されました

Rakeタスクを使って大きなプロジェクトをエクスポートできます。

パラメータを指定します:

属性種類必須説明
username文字列です。yesユーザー名
namespace_path文字列です。yes名前空間パス
project_path文字列です。yesプロジェクト名
archive_path文字列です。yesエクスポートプロジェクトのtarballを保存するファイルへのパス
gitlab-rake "gitlab:import_export:export[username, namespace_path, project_path, archive_path]"

トラブルシューティング

インポート/エクスポートに問題がある場合、同じRakeタスクを使ってデバッグモードを有効にすることができます:

# Import
IMPORT_DEBUG=true gitlab-rake "gitlab:import_export:import[root, group/subgroup, testingprojectimport, /path/to/file_to_import.tar.gz]"

# Export
EXPORT_DEBUG=true gitlab-rake "gitlab:import_export:export[root, group/subgroup, projectnametoexport, /tmp/export_file.tar.gz]"

以下に挙げる一般的なエラーとその意味、修正方法を確認してください。

Exception: undefined method 'name' for nil:NilClass

username は無効です。

Exception: undefined method 'full_path' for nil:NilClass

namespace_path が存在しません。たとえば、グループまたはサブグループのいずれかが間違って入力されているか、見つからないか、パスにプロジェクト名を指定しています。

タスクはプロジェクトを作成するだけです。新しいグループやサブグループにインポートしたい場合は、まずそれを作成してください。

Exception: No such file or directory @ rb_sysopen - (filename)

archive_path に指定されたプロジェクト・エクスポート・ファイルがありません。

Exception: Permission denied @ rb_sysopen - (filename)

指定されたプロジェクト・エクスポート・ファイルにgit ユーザーがアクセスできません。

イシューを修正するには、以下の手順に従ってください:

  1. ファイルのオーナーをgit:git に設定します。
  2. ファイルの権限を0400 に変更します。
  3. ファイルを公開フォルダに移動します(例:/tmp/ )。

Name can contain only letters, digits, emoji ...

Name can contain only letters, digits, emoji, '_', '.', '+', dashes, or spaces. It must start with a letter,
digit, emoji, or '_', and Path can contain only letters, digits, '_', '-', or '.'. It cannot start
with '-', end in '.git', or end in '.atom'.

project_path で指定されたプロジェクト名は、指定されたいずれかの理由で無効です。

プロジェクト名はproject_pathにのみ記述してください。例えば、サブグループのパスを指定した場合、/ はプロジェクト名に有効な文字ではないため、このエラーで失敗します。

Name has already been taken and Path has already been taken

その名前のプロジェクトはすでに存在します。

Exception: Error importing repository into (namespace) - No space left on device

インポートを完了するには、ディスクの空き容量が不足しています。

インポート中、tarball は設定したshared_path ディレクトリにキャッシュされます。ディスクに、キャッシュされた tar ボールと解凍されたプロジェクトファイルの両方を格納できる十分な空き容量があることを確認してください。

インポートは成功しましたが、Total number of not imported relations: XX メッセージが表示され、インポート中にイシューが作成されません。

Total number of not imported relations: XX 、インポート中にイシューが作成されない場合は、exceptions_json.logを確認してください。N is out of range for ActiveModel::Type::Integer with limit 4 bytesのようなエラーが表示されるかもしれません。N は4バイトの整数制限を超える整数です。この場合、イシューのrelative_position フィールドのリバランシングで問題が発生している可能性があります。

# Check the current maximum value of relative_position
Issue.where(project_id: Project.find(ID).root_namespace.all_projects).maximum(:relative_position)

# Run the rebalancing process and check if the maximum value of relative_position has changed
Issues::RelativePositionRebalancingService.new(Project.find(ID).root_namespace.all_projects).execute
Issue.where(project_id: Project.find(ID).root_namespace.all_projects).maximum(:relative_position)

インポートを繰り返し、イシューが正常にインポートされているか確認してください。

インポート時にGitalyがエラーを呼び出します。

大きなプロジェクトを開発環境にインポートしようとすると、Gitalyは呼び出しや呼び出しが多すぎるというエラーを投げるかもしれません。例えば

Error importing repository into qa-perf-testing/gitlabhq - GitalyClient#call called 31 times from single request. Potential n+1?

このエラーは、開発者セットアップの呼び出し回数がn+1回に制限されているためです。このエラーを解決するには、GITALY_DISABLE_REQUEST_LIMITS=1 を環境変数として設定してください。その後、開発環境を再起動し、再度インポートしてください。