--- stage: Create group: Source Code info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments description: Documentation for the REST API for Git commits in GitLab. title: Commits API --- {{< details >}} - Tier: Free, Premium, Ultimate - Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated {{< /details >}} This API operates on [repository commits](https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository). Read more about [GitLab-specific information](../user/project/repository/_index.md#commit-changes-to-a-repository) for commits. ## Responses Some date fields in responses from this API are, or can appear to be, duplicated information: - The `created_at` field exists solely for consistency with other GitLab APIs. It is always identical to the `committed_date` field. - The `committed_date` and `authored_date` fields are generated from different sources, and may not be identical. ### Pagination response headers For performance reasons, GitLab does not return the following headers in Commits API responses: - `x-total` - `x-total-pages` For more information, see [issue 389582](https://gitlab.com/gitlab-org/gitlab/-/issues/389582). ## List repository commits Get a list of repository commits in a project. ```plaintext GET /projects/:id/repository/commits ``` | Attribute | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths) | | `ref_name` | string | no | The name of a repository branch, tag or revision range, or if not given the default branch | | `since` | string | no | Only commits after or on this date are returned in ISO 8601 format `YYYY-MM-DDTHH:MM:SSZ` | | `until` | string | no | Only commits before or on this date are returned in ISO 8601 format `YYYY-MM-DDTHH:MM:SSZ` | | `path` | string | no | The file path | | `author` | string | no | Search commits by commit author.| | `all` | boolean | no | Retrieve every commit from the repository. When set to `true`, the `ref_name` parameter is ignored | | `with_stats` | boolean | no | Stats about each commit are added to the response | | `first_parent` | boolean | no | Follow only the first parent commit upon seeing a merge commit | | `order` | string | no | List commits in order. Possible values: `default`, [`topo`](https://git-scm.com/docs/git-log#Documentation/git-log.txt---topo-order). Defaults to `default`, the commits are shown in reverse chronological order. | | `trailers` | boolean | no | Parse and include [Git trailers](https://git-scm.com/docs/git-interpret-trailers) for every commit | ```shell curl --header "PRIVATE-TOKEN: " \ --url "https://gitlab.example.com/api/v4/projects/5/repository/commits" ``` Example response: ```json [ { "id": "ed899a2f4b50b4370feeea94676502b42383c746", "short_id": "ed899a2f4b5", "title": "Replace sanitize with escape once", "author_name": "Example User", "author_email": "user@example.com", "authored_date": "2021-09-20T11:50:22.001+00:00", "committer_name": "Administrator", "committer_email": "admin@example.com", "committed_date": "2021-09-20T11:50:22.001+00:00", "created_at": "2021-09-20T11:50:22.001+00:00", "message": "Replace sanitize with escape once", "parent_ids": [ "6104942438c14ec7bd21c6cd5bd995272b3faff6" ], "web_url": "https://gitlab.example.com/janedoe/gitlab-foss/-/commit/ed899a2f4b50b4370feeea94676502b42383c746", "trailers": {}, "extended_trailers": {} }, { "id": "6104942438c14ec7bd21c6cd5bd995272b3faff6", "short_id": "6104942438c", "title": "Sanitize for network graph", "author_name": "randx", "author_email": "user@example.com", "committer_name": "ExampleName", "committer_email": "user@example.com", "created_at": "2021-09-20T09:06:12.201+00:00", "message": "Sanitize for network graph\nCc: John Doe \nCc: Jane Doe ", "parent_ids": [ "ae1d9fb46aa2b07ee9836d49862ec4e2c46fbbba" ], "web_url": "https://gitlab.example.com/janedoe/gitlab-foss/-/commit/ed899a2f4b50b4370feeea94676502b42383c746", "trailers": { "Cc": "Jane Doe " }, "extended_trailers": { "Cc": [ "John Doe ", "Jane Doe " ] } } ] ``` ## Create a commit with multiple files and actions Create a commit by posting a JSON payload ```plaintext POST /projects/:id/repository/commits ``` | Attribute | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths) | | `branch` | string | yes | Name of the branch to commit into. To create a new branch, also provide either `start_branch` or `start_sha`, and optionally `start_project`. | | `commit_message` | string | yes | Commit message | | `start_branch` | string | no | Name of the branch to start the new branch from | | `start_sha` | string | no | SHA of the commit to start the new branch from | | `start_project` | integer/string | no | The project ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths) to start the new branch from. Defaults to the value of `id`. | | `actions[]` | array | yes | An array of action hashes to commit as a batch. See the next table for what attributes it can take. | | `author_email` | string | no | Specify the commit author's email address | | `author_name` | string | no | Specify the commit author's name | | `stats` | boolean | no | Include commit stats. Default is true | | `force` | boolean | no | When `true` overwrites the target branch with a new commit based on the `start_branch` or `start_sha` | | `actions[]` Attribute | Type | Required | Description | |-----------------------|---------|----------|-------------| | `action` | string | yes | The action to perform: `create`, `delete`, `move`, `update`, or `chmod`. | | `file_path` | string | yes | Full path to the file. For example: `lib/class.rb`. | | `previous_path` | string | no | Original full path to the file being moved. For example `lib/class1.rb`. Only considered for `move` action. | | `content` | string | no | File content, required for all except `delete`, `chmod`, and `move`. Move actions that do not specify `content` preserve the existing file content, and any other value of `content` overwrites the file content. | | `encoding` | string | no | `text` or `base64`. `text` is default. | | `last_commit_id` | string | no | Last known file commit ID. Only considered in update, move, and delete actions. | | `execute_filemode` | boolean | no | When `true/false` enables/disables the execute flag on the file. Only considered for `chmod` action. | ```shell PAYLOAD=$(cat << 'JSON' { "branch": "main", "commit_message": "some commit message", "actions": [ { "action": "create", "file_path": "foo/bar", "content": "some content" }, { "action": "delete", "file_path": "foo/bar2" }, { "action": "move", "file_path": "foo/bar3", "previous_path": "foo/bar4", "content": "some content" }, { "action": "update", "file_path": "foo/bar5", "content": "new content" }, { "action": "chmod", "file_path": "foo/bar5", "execute_filemode": true } ] } JSON ) curl --request POST \ --header "PRIVATE-TOKEN: " \ --header "Content-Type: application/json" \ --data "$PAYLOAD" \ --url "https://gitlab.example.com/api/v4/projects/1/repository/commits" ``` Example response: ```json { "id": "ed899a2f4b50b4370feeea94676502b42383c746", "short_id": "ed899a2f4b5", "title": "some commit message", "author_name": "Example User", "author_email": "user@example.com", "committer_name": "Example User", "committer_email": "user@example.com", "created_at": "2016-09-20T09:26:24.000-07:00", "message": "some commit message", "parent_ids": [ "ae1d9fb46aa2b07ee9836d49862ec4e2c46fbbba" ], "committed_date": "2016-09-20T09:26:24.000-07:00", "authored_date": "2016-09-20T09:26:24.000-07:00", "stats": { "additions": 2, "deletions": 2, "total": 4 }, "status": null, "web_url": "https://gitlab.example.com/janedoe/gitlab-foss/-/commit/ed899a2f4b50b4370feeea94676502b42383c746" } ``` GitLab supports [form encoding](rest/_index.md#array-and-hash-types). The following is an example using Commit API with form encoding: ```shell curl --request POST \ --form "branch=main" \ --form "commit_message=some commit message" \ --form "start_branch=main" \ --form "actions[][action]=create" \ --form "actions[][file_path]=foo/bar" \ --form "actions[][content]=" \ "https://gitlab.example.com/api/v4/projects/1/repository/commits" ``` ## Get a single commit Get a specific commit identified by the commit hash or name of a branch or tag. ```plaintext GET /projects/:id/repository/commits/:sha ``` Parameters: | Attribute | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths) | | `sha` | string | yes | The commit hash or name of a repository branch or tag | | `stats` | boolean | no | Include commit stats. Default is true | ```shell curl --header "PRIVATE-TOKEN: " \ --url "https://gitlab.example.com/api/v4/projects/5/repository/commits/main" ``` Example response: ```json { "id": "6104942438c14ec7bd21c6cd5bd995272b3faff6", "short_id": "6104942438c", "title": "Sanitize for network graph", "author_name": "randx", "author_email": "user@example.com", "committer_name": "Dmitriy", "committer_email": "user@example.com", "created_at": "2021-09-20T09:06:12.300+03:00", "message": "Sanitize for network graph", "committed_date": "2021-09-20T09:06:12.300+03:00", "authored_date": "2021-09-20T09:06:12.420+03:00", "parent_ids": [ "ae1d9fb46aa2b07ee9836d49862ec4e2c46fbbba" ], "last_pipeline": { "id": 8, "ref": "main", "sha": "2dc6aa325a317eda67812f05600bdf0fcdc70ab0", "status": "created" }, "stats": { "additions": 15, "deletions": 10, "total": 25 }, "status": "running", "web_url": "https://gitlab.example.com/janedoe/gitlab-foss/-/commit/6104942438c14ec7bd21c6cd5bd995272b3faff6" } ``` ## Get references a commit is pushed to Get all references (from branches or tags) a commit is pushed to. The pagination parameters `page` and `per_page` can be used to restrict the list of references. ```plaintext GET /projects/:id/repository/commits/:sha/refs ``` Parameters: | Attribute | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths) | | `sha` | string | yes | The commit hash | | `type` | string | no | The scope of commits. Possible values `branch`, `tag`, `all`. Default is `all`. | ```shell curl --header "PRIVATE-TOKEN: " \ --url "https://gitlab.example.com/api/v4/projects/5/repository/commits/5937ac0a7beb003549fc5fd26fc247adbce4a52e/refs?type=all" ``` Example response: ```json [ { "type": "branch", "name": "'test'" }, { "type": "branch", "name": "add-balsamiq-file" }, { "type": "branch", "name": "wip" }, { "type": "tag", "name": "v1.1.0" } ] ``` ## Get the sequence of a commit {{< history >}} - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/438151) in GitLab 16.9. {{< /history >}} Get the sequence number of a commit in a project by following the parent links from the given commit. This API provides essentially the same features as the `git rev-list --count` command for a given commit SHA. ```plaintext GET /projects/:id/repository/commits/:sha/sequence ``` Parameters: | Attribute | Type | Required | Description | | -------------- | -------------- | -------- | ----------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths). | | `sha` | string | yes | The commit hash. | | `first_parent` | boolean | no | Follow only the first parent commit upon seeing a merge commit. | Example request: ```shell curl --header "PRIVATE-TOKEN: " \ --url "https://gitlab.example.com/api/v4/projects/5/repository/commits/5937ac0a7beb003549fc5fd26fc247adbce4a52e/sequence" ``` Example response: ```json { "count": 632 } ``` ## Cherry-pick a commit Cherry-picks a commit to a given branch. ```plaintext POST /projects/:id/repository/commits/:sha/cherry_pick ``` Parameters: | Attribute | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths) | | `sha` | string | yes | The commit hash | | `branch` | string | yes | The name of the branch | | `dry_run` | boolean | no | Does not commit any changes. Default is false. | | `message` | string | no | A custom commit message to use for the new commit. | ```shell curl --request POST \ --header "PRIVATE-TOKEN: " \ --form "branch=main" \ --url "https://gitlab.example.com/api/v4/projects/5/repository/commits/main/cherry_pick" ``` Example response: ```json { "id": "8b090c1b79a14f2bd9e8a738f717824ff53aebad", "short_id": "8b090c1b", "author_name": "Example User", "author_email": "user@example.com", "authored_date": "2016-12-12T20:10:39.000+01:00", "created_at": "2016-12-12T20:10:39.000+01:00", "committer_name": "Administrator", "committer_email": "admin@example.com", "committed_date": "2016-12-12T20:10:39.000+01:00", "title": "Feature added", "message": "Feature added\n\nSigned-off-by: Example User \n", "parent_ids": [ "a738f717824ff53aebad8b090c1b79a14f2bd9e8" ], "web_url": "https://gitlab.example.com/janedoe/gitlab-foss/-/commit/8b090c1b79a14f2bd9e8a738f717824ff53aebad" } ``` In the event of a failed cherry-pick, the response provides context about why: ```json { "message": "Sorry, we cannot cherry-pick this commit automatically. This commit may already have been cherry-picked, or a more recent commit may have updated some of its content.", "error_code": "empty" } ``` In this case, the cherry-pick failed because the changeset was empty and likely indicates that the commit already exists in the target branch. The other possible error code is `conflict`, which indicates that there was a merge conflict. When `dry_run` is enabled, the server attempts to apply the cherry-pick _but not actually commit any resulting changes_. If the cherry-pick applies cleanly, the API responds with `200 OK`: ```json { "dry_run": "success" } ``` In the event of a failure, an error displays that is identical to a failure without dry run. ## Revert a commit Reverts a commit in a given branch. ```plaintext POST /projects/:id/repository/commits/:sha/revert ``` Parameters: | Attribute | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths) | | `sha` | string | yes | Commit SHA to revert | | `branch` | string | yes | Target branch name | | `dry_run` | boolean | no | Does not commit any changes. Default is false. | ```shell curl --request POST \ --header "PRIVATE-TOKEN: " \ --form "branch=main" \ --url "https://gitlab.example.com/api/v4/projects/5/repository/commits/a738f717824ff53aebad8b090c1b79a14f2bd9e8/revert" ``` Example response: ```json { "id": "8b090c1b79a14f2bd9e8a738f717824ff53aebad", "short_id": "8b090c1b", "title": "Revert \"Feature added\"", "created_at": "2018-11-08T15:55:26.000Z", "parent_ids": [ "a738f717824ff53aebad8b090c1b79a14f2bd9e8" ], "message": "Revert \"Feature added\"\n\nThis reverts commit a738f717824ff53aebad8b090c1b79a14f2bd9e8", "author_name": "Administrator", "author_email": "admin@example.com", "authored_date": "2018-11-08T15:55:26.000Z", "committer_name": "Administrator", "committer_email": "admin@example.com", "committed_date": "2018-11-08T15:55:26.000Z", "web_url": "https://gitlab.example.com/janedoe/gitlab-foss/-/commit/8b090c1b79a14f2bd9e8a738f717824ff53aebad" } ``` In the event of a failed revert, the response provides context about why: ```json { "message": "Sorry, we cannot revert this commit automatically. This commit may already have been reverted, or a more recent commit may have updated some of its content.", "error_code": "conflict" } ``` In this case, the revert failed because the attempted revert generated a merge conflict. The other possible error code is `empty`, which indicates that the changeset was empty, likely due to the change having already been reverted. When `dry_run` is enabled, the server attempts to apply the revert _but not actually commit any resulting changes_. If the revert applies cleanly, the API responds with `200 OK`: ```json { "dry_run": "success" } ``` In the event of a failure, an error displays that is identical to a failure without dry run. ## Get the diff of a commit Get the diff of a commit in a project. ```plaintext GET /projects/:id/repository/commits/:sha/diff ``` Parameters: | Attribute | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths) | | `sha` | string | yes | The commit hash or name of a repository branch or tag | | `unidiff` | boolean | no | Present diffs in the [unified diff](https://www.gnu.org/software/diffutils/manual/html_node/Detailed-Unified.html) format. Default is false. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/130610) in GitLab 16.5. | ```shell curl --header "PRIVATE-TOKEN: " \ --url "https://gitlab.example.com/api/v4/projects/5/repository/commits/main/diff" ``` Example response: ```json [ { "diff": "@@ -71,6 +71,8 @@\n sudo -u git -H bundle exec rake migrate_keys RAILS_ENV=production\n sudo -u git -H bundle exec rake migrate_inline_notes RAILS_ENV=production\n \n+sudo -u git -H bundle exec rake gitlab:assets:compile RAILS_ENV=production\n+\n ```\n \n ### 6. Update config files", "new_path": "doc/update/5.4-to-6.0.md", "old_path": "doc/update/5.4-to-6.0.md", "a_mode": null, "b_mode": "100644", "new_file": false, "renamed_file": false, "deleted_file": false } ] ``` ## Get the comments of a commit Get the comments of a commit in a project. ```plaintext GET /projects/:id/repository/commits/:sha/comments ``` Parameters: | Attribute | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths) | | `sha` | string | yes | The commit hash or name of a repository branch or tag | ```shell curl --header "PRIVATE-TOKEN: " \ --url "https://gitlab.example.com/api/v4/projects/5/repository/commits/main/comments" ``` Example response: ```json [ { "note": "this code is really nice", "author": { "id": 11, "username": "admin", "email": "admin@local.host", "name": "Administrator", "state": "active", "created_at": "2014-03-06T08:17:35.000Z" } } ] ``` ## Post comment to commit Adds a comment to a commit. To post a comment in a particular line of a particular file, you must specify the full commit SHA, the `path`, the `line`, and `line_type` should be `new`. The comment is added at the end of the last commit if at least one of the following cases is valid: - the `sha` is instead a branch or a tag and the `line` or `path` are invalid - the `line` number is invalid (does not exist) - the `path` is invalid (does not exist) In any of the previous cases, the response of `line`, `line_type` and `path` is set to `null`. For other approaches to commenting on a merge request, see [Create new merge request note](notes.md#create-new-merge-request-note) in the Notes API, and [Create a new thread in the merge request diff](discussions.md#create-a-new-thread-in-the-merge-request-diff) in the Discussions API. ```plaintext POST /projects/:id/repository/commits/:sha/comments ``` | Attribute | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths) | | `sha` | string | yes | The commit SHA or name of a repository branch or tag | | `note` | string | yes | The text of the comment | | `path` | string | no | The file path relative to the repository | | `line` | integer | no | The line number where the comment should be placed | | `line_type` | string | no | The line type. Takes `new` or `old` as arguments | ```shell curl --request POST \ --header "PRIVATE-TOKEN: " \ --form "note=Nice picture\!" \ --form "path=README.md" \ --form "line=11" \ --form "line_type=new" \ --url "https://gitlab.example.com/api/v4/projects/17/repository/commits/18f3e63d05582537db6d183d9d557be09e1f90c8/comments" ``` Example response: ```json { "author": { "web_url": "https://gitlab.example.com/janedoe", "avatar_url": "https://gitlab.example.com/uploads/user/avatar/28/jane-doe-400-400.png", "username": "janedoe", "state": "active", "name": "Jane Doe", "id": 28 }, "created_at": "2016-01-19T09:44:55.600Z", "line_type": "new", "path": "README.md", "line": 11, "note": "Nice picture!" } ``` ## Get the discussions of a commit Get the discussions of a commit in a project. ```plaintext GET /projects/:id/repository/commits/:sha/discussions ``` Parameters: | Attribute | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths) | | `sha` | string | yes | The commit hash or name of a repository branch or tag | ```shell curl --header "PRIVATE-TOKEN: " \ --url "https://gitlab.example.com/api/v4/projects/5/repository/commits/4604744a1c64de00ff62e1e8a6766919923d2b41/discussions" ``` Example response: ```json [ { "id": "4604744a1c64de00ff62e1e8a6766919923d2b41", "individual_note": true, "notes": [ { "id": 334686748, "type": null, "body": "Nice piece of code!", "attachment": null, "author": { "id": 28, "name": "Jane Doe", "username": "janedoe", "web_url": "https://gitlab.example.com/janedoe", "state": "active", "avatar_url": "https://gitlab.example.com/uploads/user/avatar/28/jane-doe-400-400.png" }, "created_at": "2020-04-30T18:48:11.432Z", "updated_at": "2020-04-30T18:48:11.432Z", "system": false, "noteable_id": null, "noteable_type": "Commit", "resolvable": false, "confidential": null, "noteable_iid": null, "commands_changes": {} } ] } ] ``` ## Commit status The commit status API for use with GitLab. ### List the statuses of a commit {{< history >}} - `pipeline_id`, `order_by`, and `sort` fields [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/176142) in GitLab 17.9. {{< /history >}} List the statuses of a commit in a project. The pagination parameters `page` and `per_page` can be used to restrict the list of references. ```plaintext GET /projects/:id/repository/commits/:sha/statuses ``` | Attribute | Type | Required | Description | |---------------|----------------| -------- |--------------------------------------------------------------------------------------| | `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths). | | `sha` | string | Yes | Hash of the commit. | | `ref` | string | No | Name of the branch or tag. Default is the default branch. | | `stage` | string | No | Filter statuses by [build stage](../ci/yaml/_index.md#stages). For example, `test`. | | `name` | string | No | Filter statuses by [job name](../ci/yaml/_index.md#job-keywords). For example, `bundler:audit`. | | `pipeline_id` | integer | No | Filter statuses by pipeline ID. For example, `1234`. | | `order_by` | string | No | Values for sorting statuses. Valid values are `id` and `pipeline_id`. Default is `id`. | | `sort` | string | No | Sort statuses in ascending or descending order. Valid values are `asc` and `desc`. Default is `asc`. | | `all` | boolean | No | Include all statuses instead of latest only. Default is `false`. | ```shell curl --header "PRIVATE-TOKEN: " \ --url "https://gitlab.example.com/api/v4/projects/17/repository/commits/18f3e63d05582537db6d183d9d557be09e1f90c8/statuses" ``` Example response: ```json [ ... { "status": "pending", "created_at": "2016-01-19T08:40:25.934Z", "started_at": null, "name": "bundler:audit", "allow_failure": true, "author": { "username": "janedoe", "state": "active", "web_url": "https://gitlab.example.com/janedoe", "avatar_url": "https://gitlab.example.com/uploads/user/avatar/28/jane-doe-400-400.png", "id": 28, "name": "Jane Doe" }, "description": null, "sha": "18f3e63d05582537db6d183d9d557be09e1f90c8", "target_url": "https://gitlab.example.com/janedoe/gitlab-foss/builds/91", "finished_at": null, "id": 91, "ref": "main" }, { "started_at": null, "name": "test", "allow_failure": false, "status": "pending", "created_at": "2016-01-19T08:40:25.832Z", "target_url": "https://gitlab.example.com/janedoe/gitlab-foss/builds/90", "id": 90, "finished_at": null, "ref": "main", "sha": "18f3e63d05582537db6d183d9d557be09e1f90c8", "author": { "id": 28, "name": "Jane Doe", "username": "janedoe", "web_url": "https://gitlab.example.com/janedoe", "state": "active", "avatar_url": "https://gitlab.example.com/uploads/user/avatar/28/jane-doe-400-400.png" }, "description": null } ... ] ``` ### Set the pipeline status of a commit Add or update the pipeline status of a commit. If the commit is associated with a merge request, the API call must target the commit in the merge request's source branch. If a pipeline already exists and it exceeds the [maximum number of jobs in a single pipeline limit](../administration/instance_limits.md#maximum-number-of-jobs-in-a-pipeline): - If `pipeline_id` is specified, a `422` error is returned: `The number of jobs has exceeded the limit`. - Otherwise, a new pipeline is created. ```plaintext POST /projects/:id/statuses/:sha ``` | Attribute | Type | Required | Description | | --------- | ---- | -------- |-----------------------------------------------------------------------------------------------------------------------| | `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths) | | `sha` | string | yes | The commit SHA | | `state` | string | yes | The state of the status. Can be one of the following: `pending`, `running`, `success`, `failed`, `canceled`, `skipped` | | `ref` | string | no | The `ref` (branch or tag) to which the status refers. Must be 255 characters or fewer. | | `name` or `context` | string | no | The label to differentiate this status from the status of other systems. Default value is `default` | | `target_url` | string | no | The target URL to associate with this status. Must be 255 characters or fewer. | | `description` | string | no | The short description of the status. Must be 255 characters or fewer. | | `coverage` | float | no | The total code coverage | | `pipeline_id` | integer | no | The ID of the pipeline to set status. Use in case of several pipeline on same SHA. | ```shell curl --request POST \ --header "PRIVATE-TOKEN: " \ --url "https://gitlab.example.com/api/v4/projects/17/statuses/18f3e63d05582537db6d183d9d557be09e1f90c8?state=success" ``` Example response: ```json { "author": { "web_url": "https://gitlab.example.com/janedoe", "name": "Jane Doe", "avatar_url": "https://gitlab.example.com/uploads/user/avatar/28/jane-doe-400-400.png", "username": "janedoe", "state": "active", "id": 28 }, "name": "default", "sha": "18f3e63d05582537db6d183d9d557be09e1f90c8", "status": "success", "coverage": 100.0, "description": null, "id": 93, "target_url": null, "ref": null, "started_at": null, "created_at": "2016-01-19T09:05:50.355Z", "allow_failure": false, "finished_at": "2016-01-19T09:05:50.365Z" } ``` ## List merge requests associated with a commit {{< history >}} - `state` attribute [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/191169) in GitLab 18.2. {{< /history >}} Returns information about the merge request that originally introduced a specific commit. ```plaintext GET /projects/:id/repository/commits/:sha/merge_requests ``` | Attribute | Type | Required | Description | |-----------|----------------|----------|-------------| | `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths) | | `sha` | string | Yes | The commit SHA | | `state` | string | No | Returns merge requests with the specified state: `opened`, `closed`, `locked`, or `merged`. Omit this parameter to get all merge requests regardless of state. | ```shell curl --header "PRIVATE-TOKEN: " \ --url "https://gitlab.example.com/api/v4/projects/5/repository/commits/af5b13261899fb2c0db30abdd0af8b07cb44fdc5/merge_requests?state=opened" ``` Example response: ```json [ { "id": 45, "iid": 1, "project_id": 35, "title": "Add new file", "description": "", "state": "opened", "created_at": "2018-03-26T17:26:30.916Z", "updated_at": "2018-03-26T17:26:30.916Z", "target_branch": "main", "source_branch": "test-branch", "upvotes": 0, "downvotes": 0, "author": { "web_url": "https://gitlab.example.com/janedoe", "name": "Jane Doe", "avatar_url": "https://gitlab.example.com/uploads/user/avatar/28/jane-doe-400-400.png", "username": "janedoe", "state": "active", "id": 28 }, "assignee": null, "source_project_id": 35, "target_project_id": 35, "labels": [], "draft": false, "work_in_progress": false, "milestone": null, "merge_when_pipeline_succeeds": false, "merge_status": "can_be_merged", "sha": "af5b13261899fb2c0db30abdd0af8b07cb44fdc5", "merge_commit_sha": null, "squash_commit_sha": null, "user_notes_count": 0, "discussion_locked": null, "should_remove_source_branch": null, "force_remove_source_branch": false, "web_url": "https://gitlab.example.com/root/test-project/merge_requests/1", "time_stats": { "time_estimate": 0, "total_time_spent": 0, "human_time_estimate": null, "human_total_time_spent": null } } ] ``` ## Get signature of a commit Get the [signature from a commit](../user/project/repository/signed_commits/_index.md), if it is signed. For unsigned commits, it results in a 404 response. ```plaintext GET /projects/:id/repository/commits/:sha/signature ``` Parameters: | Attribute | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths) | | `sha` | string | yes | The commit hash or name of a repository branch or tag | ```shell curl --header "PRIVATE-TOKEN: " \ --url "https://gitlab.example.com/api/v4/projects/1/repository/commits/da738facbc19eb2fc2cef57c49be0e6038570352/signature" ``` Example response if commit is GPG signed: ```json { "signature_type": "PGP", "verification_status": "verified", "gpg_key_id": 1, "gpg_key_primary_keyid": "8254AAB3FBD54AC9", "gpg_key_user_name": "John Doe", "gpg_key_user_email": "johndoe@example.com", "gpg_key_subkey_id": null, "commit_source": "gitaly" } ``` Example response if commit is signed with SSH: ```json { "signature_type": "SSH", "verification_status": "verified", "key": { "id": 11, "title": "Key", "created_at": "2023-05-08T09:12:38.503Z", "expires_at": "2024-05-07T00:00:00.000Z", "key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILZzYDq6DhLp3aX84DGIV3F6Vf+Ae4yCTTz7RnqMJOlR MyKey)", "usage_type": "auth_and_signing" }, "commit_source": "gitaly" } ``` Example response if commit is X.509 signed: ```json { "signature_type": "X509", "verification_status": "unverified", "x509_certificate": { "id": 1, "subject": "CN=gitlab@example.org,OU=Example,O=World", "subject_key_identifier": "BC:BC:BC:BC:BC:BC:BC:BC:BC:BC:BC:BC:BC:BC:BC:BC:BC:BC:BC:BC", "email": "gitlab@example.org", "serial_number": 278969561018901340486471282831158785578, "certificate_status": "good", "x509_issuer": { "id": 1, "subject": "CN=PKI,OU=Example,O=World", "subject_key_identifier": "AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB:AB", "crl_url": "http://example.com/pki.crl" } }, "commit_source": "gitaly" } ``` Example response if commit is unsigned: ```json { "message": "404 GPG Signature Not Found" } ```