Project repository storage moves API (FREE SELF)
Introduced in GitLab 13.0.
Project repositories including wiki and design repositories can be moved between storages. This can be useful when migrating to Gitaly Cluster, for example.
As project repository storage moves are processed, they transition through different states. Values
of state
are:
initial
scheduled
started
finished
failed
replicated
cleanup failed
To ensure data integrity, projects are put in a temporary read-only state for the
duration of the move. During this time, users receive a The repository is temporarily read-only. Please try again later.
message if they try to push new commits.
This API requires you to authenticate yourself as an administrator.
For other repository types see:
Retrieve all project repository storage moves
GET /project_repository_storage_moves
By default, GET
requests return 20 results at a time because the API results
are paginated.
Example request:
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/project_repository_storage_moves"
Example response:
[
{
"id": 1,
"created_at": "2020-05-07T04:27:17.234Z",
"state": "scheduled",
"source_storage_name": "default",
"destination_storage_name": "storage2",
"project": {
"id": 1,
"description": null,
"name": "project1",
"name_with_namespace": "John Doe2 / project1",
"path": "project1",
"path_with_namespace": "namespace1/project1",
"created_at": "2020-05-07T04:27:17.016Z"
}
}
]
Retrieve all repository storage moves for a project
GET /projects/:project_id/repository_storage_moves
By default, GET
requests return 20 results at a time because the API results
are paginated.
Parameters:
Attribute | Type | Required | Description |
---|---|---|---|
project_id |
integer | yes | ID of the project |
Example request:
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/repository_storage_moves"
Example response:
[
{
"id": 1,
"created_at": "2020-05-07T04:27:17.234Z",
"state": "scheduled",
"source_storage_name": "default",
"destination_storage_name": "storage2",
"project": {
"id": 1,
"description": null,
"name": "project1",
"name_with_namespace": "John Doe2 / project1",
"path": "project1",
"path_with_namespace": "namespace1/project1",
"created_at": "2020-05-07T04:27:17.016Z"
}
}
]
Get a single project repository storage move
GET /project_repository_storage_moves/:repository_storage_id
Parameters:
Attribute | Type | Required | Description |
---|---|---|---|
repository_storage_id |
integer | yes | ID of the project repository storage move |
Example request:
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/project_repository_storage_moves/1"
Example response:
{
"id": 1,
"created_at": "2020-05-07T04:27:17.234Z",
"state": "scheduled",
"source_storage_name": "default",
"destination_storage_name": "storage2",
"project": {
"id": 1,
"description": null,
"name": "project1",
"name_with_namespace": "John Doe2 / project1",
"path": "project1",
"path_with_namespace": "namespace1/project1",
"created_at": "2020-05-07T04:27:17.016Z"
}
}
Get a single repository storage move for a project
GET /projects/:project_id/repository_storage_moves/:repository_storage_id
Parameters:
Attribute | Type | Required | Description |
---|---|---|---|
project_id |
integer | yes | ID of the project |
repository_storage_id |
integer | yes | ID of the project repository storage move |
Example request:
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/repository_storage_moves/1"
Example response:
{
"id": 1,
"created_at": "2020-05-07T04:27:17.234Z",
"state": "scheduled",
"source_storage_name": "default",
"destination_storage_name": "storage2",
"project": {
"id": 1,
"description": null,
"name": "project1",
"name_with_namespace": "John Doe2 / project1",
"path": "project1",
"path_with_namespace": "namespace1/project1",
"created_at": "2020-05-07T04:27:17.016Z"
}
}
Schedule a repository storage move for a project
- Introduced in GitLab 13.1.
- Introduced in GitLab 13.3, original repository is automatically removed after successful move and integrity check.
WARNING: Before GitLab 13.3, a repository move worked more like a repository copy as the original repository was not deleted from the original storage disk location and had to be manually cleaned up.
POST /projects/:project_id/repository_storage_moves
Parameters:
Attribute | Type | Required | Description |
---|---|---|---|
project_id |
integer | yes | ID of the project |
destination_storage_name |
string | no | Name of the destination storage shard. In GitLab 13.5 and later, the storage is selected automatically based on storage weights if not provided |
Example request:
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" --header "Content-Type: application/json" \
--data '{"destination_storage_name":"storage2"}' "https://gitlab.example.com/api/v4/projects/1/repository_storage_moves"
Example response:
{
"id": 1,
"created_at": "2020-05-07T04:27:17.234Z",
"state": "scheduled",
"source_storage_name": "default",
"destination_storage_name": "storage2",
"project": {
"id": 1,
"description": null,
"name": "project1",
"name_with_namespace": "John Doe2 / project1",
"path": "project1",
"path_with_namespace": "namespace1/project1",
"created_at": "2020-05-07T04:27:17.016Z"
}
}
Schedule repository storage moves for all projects on a storage shard
Introduced in GitLab 13.7.
Schedules repository storage moves for each project repository stored on the source storage shard.
POST /project_repository_storage_moves
Parameters:
Attribute | Type | Required | Description |
---|---|---|---|
source_storage_name |
string | yes | Name of the source storage shard. |
destination_storage_name |
string | no | Name of the destination storage shard. The storage is selected automatically based on storage weights if not provided. |
Example request:
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" --header "Content-Type: application/json" \
--data '{"source_storage_name":"default"}' "https://gitlab.example.com/api/v4/project_repository_storage_moves"
Example response:
{
"message": "202 Accepted"
}