2020-07-30 08:09:33 -04:00
---
stage: Create
group: Source Code
2020-11-26 01:09:20 -05:00
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
2020-07-30 08:09:33 -04:00
type: reference, api
---
2021-02-09 13:09:59 -05:00
# Repository files API **(FREE)**
2014-05-27 08:12:15 -04:00
2021-09-21 20:09:28 -04:00
You can fetch, create, update, and delete files in your repository with this API.
You can also [configure rate limits ](../user/admin_area/settings/files_api_rate_limits.md )
for this API.
2014-02-18 05:27:02 -05:00
2021-09-21 20:09:28 -04:00
## Available scopes for personal access tokens
2014-02-18 05:27:02 -05:00
2018-12-04 09:32:06 -05:00
The different scopes available using [personal access tokens ](../user/profile/personal_access_tokens.md ) are depicted
2018-12-04 05:57:36 -05:00
in the following table.
| Scope | Description |
| ----- | ----------- |
2018-12-04 09:32:06 -05:00
| `read_repository` | Allows read-access to the repository files. |
| `api` | Allows read-write access to the repository files. |
2018-12-04 05:57:36 -05:00
2014-02-18 05:27:02 -05:00
## Get file from repository
2022-04-04 14:08:38 -04:00
> The `execute_filemode` field in the response was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83499) in GitLab 14.10.
2016-12-16 12:58:24 -05:00
Allows you to receive information about file in repository like name, size,
2021-07-28 17:08:53 -04:00
content. File content is Base64 encoded. This endpoint can be accessed
2016-12-16 12:58:24 -05:00
without authentication if the repository is publicly accessible.
2014-02-18 05:27:02 -05:00
2020-02-27 22:09:04 -05:00
```plaintext
2017-03-01 15:22:29 -05:00
GET /projects/:id/repository/files/:file_path
2014-02-18 05:27:02 -05:00
```
2020-01-30 10:09:15 -05:00
```shell
2020-05-27 20:08:37 -04:00
curl --header "PRIVATE-TOKEN: < your_access_token > " "https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fmodels%2Fkey%2Erb?ref=master"
2016-07-24 18:58:34 -04:00
```
2021-11-22 13:10:55 -05:00
| Attribute | Type | Required | Description |
|-------------|----------------|----------|-----------------------------------------------------------------------------------------------------------------|
| `id` | integer or string | yes | The ID or [URL-encoded path of the project ](index.md#namespaced-path-encoding ) owned by the authenticated user |
| `file_path` | string | yes | URL encoded full path to new file. Ex. `lib%2Fclass%2Erb` . |
| `ref` | string | yes | The name of branch, tag or commit |
2014-02-18 05:27:02 -05:00
Example response:
```json
{
"file_name": "key.rb",
"file_path": "app/models/key.rb",
"size": 1476,
"encoding": "base64",
"content": "IyA9PSBTY2hlbWEgSW5mb3...",
2018-06-28 02:10:51 -04:00
"content_sha256": "4c294617b60715c1d218e61164a3abd4808a4284cbc30e6728a01ad9aada4481",
2014-02-18 05:27:02 -05:00
"ref": "master",
"blob_id": "79f7bbd25901e8334750839545a9bd021f0e4c83",
2015-11-02 07:14:38 -05:00
"commit_id": "d5a3ff139356ce33e37e73add446f16869741b50",
2022-04-04 14:08:38 -04:00
"last_commit_id": "570e7b2abdd848b95f2f578043fc23bd6f6fd24d",
"execute_filemode": false
2014-02-18 05:27:02 -05:00
}
```
2020-12-04 16:09:29 -05:00
NOTE:
2020-06-02 14:08:32 -04:00
`blob_id` is the blob SHA, see [repositories - Get a blob from repository ](repositories.md#get-a-blob-from-repository )
2018-06-28 02:10:51 -04:00
In addition to the `GET` method, you can also use `HEAD` to get just file metadata.
2020-02-27 22:09:04 -05:00
```plaintext
2018-06-28 02:10:51 -04:00
HEAD /projects/:id/repository/files/:file_path
```
2020-01-30 10:09:15 -05:00
```shell
2020-05-27 20:08:37 -04:00
curl --head --header "PRIVATE-TOKEN: < your_access_token > " "https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fmodels%2Fkey%2Erb?ref=master"
2018-06-28 02:10:51 -04:00
```
Example response:
2020-05-19 23:08:04 -04:00
```plaintext
2018-06-28 02:10:51 -04:00
HTTP/1.1 200 OK
...
X-Gitlab-Blob-Id: 79f7bbd25901e8334750839545a9bd021f0e4c83
X-Gitlab-Commit-Id: d5a3ff139356ce33e37e73add446f16869741b50
X-Gitlab-Content-Sha256: 4c294617b60715c1d218e61164a3abd4808a4284cbc30e6728a01ad9aada4481
X-Gitlab-Encoding: base64
X-Gitlab-File-Name: key.rb
X-Gitlab-File-Path: app/models/key.rb
X-Gitlab-Last-Commit-Id: 570e7b2abdd848b95f2f578043fc23bd6f6fd24d
X-Gitlab-Ref: master
X-Gitlab-Size: 1476
2022-04-04 14:08:38 -04:00
X-Gitlab-Execute-Filemode: false
2018-06-28 02:10:51 -04:00
...
```
2019-07-04 07:59:10 -04:00
## Get file blame from repository
2020-04-07 23:09:31 -04:00
Allows you to receive blame information. Each blame range contains lines and corresponding commit information.
2019-07-04 07:59:10 -04:00
2020-02-27 22:09:04 -05:00
```plaintext
2019-07-04 07:59:10 -04:00
GET /projects/:id/repository/files/:file_path/blame
```
2022-04-28 14:10:01 -04:00
| Attribute | Type | Required | Description |
|-----------------|-------------------|----------|--------------------------------------------------------------------------------------------------------------|
| `id` | integer or string | yes | The ID or [URL-encoded path of the project ](index.md#namespaced-path-encoding ) owned by the authenticated user |
| `file_path` | string | yes | URL encoded full path to new file. Ex. `lib%2Fclass%2Erb` . |
| `ref` | string | yes | The name of branch, tag or commit |
| `range` | hash | no | Blame range |
| `range[start]` | integer | yes | The first line of the range to blame |
| `range[end]` | integer | yes | The last line of the range to blame |
2021-11-22 13:10:55 -05:00
2020-01-30 10:09:15 -05:00
```shell
2020-05-27 20:08:37 -04:00
curl --header "PRIVATE-TOKEN: < your_access_token > " "https://gitlab.example.com/api/v4/projects/13083/repository/files/path%2Fto%2Ffile.rb/blame?ref=master"
2019-07-04 07:59:10 -04:00
```
Example response:
```json
[
{
"commit": {
"id": "d42409d56517157c48bf3bd97d3f75974dde19fb",
"message": "Add feature\n\nalso fix bug\n",
"parent_ids": [
"cc6e14f9328fa6d7b5a0d3c30dc2002a3f2a3822"
],
"authored_date": "2015-12-18T08:12:22.000Z",
"author_name": "John Doe",
"author_email": "john.doe@example.com",
"committed_date": "2015-12-18T08:12:22.000Z",
"committer_name": "John Doe",
"committer_email": "john.doe@example.com"
},
"lines": [
"require 'fileutils'",
"require 'open3'",
""
]
},
...
]
```
2020-12-04 16:09:29 -05:00
NOTE:
2019-07-04 07:59:10 -04:00
`HEAD` method return just file metadata as in [Get file from repository ](repository_files.md#get-file-from-repository ).
2020-01-30 10:09:15 -05:00
```shell
2020-05-27 20:08:37 -04:00
curl --head --header "PRIVATE-TOKEN: < your_access_token > " "https://gitlab.example.com/api/v4/projects/13083/repository/files/path%2Fto%2Ffile.rb/blame?ref=master"
2019-07-04 07:59:10 -04:00
```
Example response:
2020-05-19 23:08:04 -04:00
```plaintext
2019-07-04 07:59:10 -04:00
HTTP/1.1 200 OK
...
X-Gitlab-Blob-Id: 79f7bbd25901e8334750839545a9bd021f0e4c83
X-Gitlab-Commit-Id: d5a3ff139356ce33e37e73add446f16869741b50
X-Gitlab-Content-Sha256: 4c294617b60715c1d218e61164a3abd4808a4284cbc30e6728a01ad9aada4481
X-Gitlab-Encoding: base64
X-Gitlab-File-Name: file.rb
X-Gitlab-File-Path: path/to/file.rb
X-Gitlab-Last-Commit-Id: 570e7b2abdd848b95f2f578043fc23bd6f6fd24d
X-Gitlab-Ref: master
X-Gitlab-Size: 1476
2022-04-04 14:08:38 -04:00
X-Gitlab-Execute-Filemode: false
2019-07-04 07:59:10 -04:00
...
```
2022-04-28 14:10:01 -04:00
### Examples
To request a blame range, specify `range[start]` and `range[end]` parameters with the start and end line numbers of the file.
```shell
curl --head --header "PRIVATE-TOKEN: < your_access_token > " "https://gitlab.example.com/api/v4/projects/13083/repository/files/path%2Fto%2Ffile.rb/blame?ref=master& range[start]=1& range[end]=2"
```
Example response:
```json
[
{
"commit": {
"id": "d42409d56517157c48bf3bd97d3f75974dde19fb",
"message": "Add feature\n\nalso fix bug\n",
"parent_ids": [
"cc6e14f9328fa6d7b5a0d3c30dc2002a3f2a3822"
],
"authored_date": "2015-12-18T08:12:22.000Z",
"author_name": "John Doe",
"author_email": "john.doe@example.com",
"committed_date": "2015-12-18T08:12:22.000Z",
"committer_name": "John Doe",
"committer_email": "john.doe@example.com"
},
"lines": [
"require 'fileutils'",
"require 'open3'"
]
},
...
]
```
2017-03-01 15:22:29 -05:00
## Get raw file from repository
2020-02-27 22:09:04 -05:00
```plaintext
2017-03-01 15:22:29 -05:00
GET /projects/:id/repository/files/:file_path/raw
```
2021-11-22 13:10:55 -05:00
| Attribute | Type | Required | Description |
|-------------|----------------|----------|-----------------------------------------------------------------------------------------------------------------|
| `id` | integer or string | yes | The ID or [URL-encoded path of the project ](index.md#namespaced-path-encoding ) owned by the authenticated user |
| `file_path` | string | yes | URL encoded full path to new file. Ex. `lib%2Fclass%2Erb` . |
| `ref` | string | yes | The name of branch, tag or commit. Default is the `HEAD` of the project. |
2020-01-30 10:09:15 -05:00
```shell
2020-05-27 20:08:37 -04:00
curl --header "PRIVATE-TOKEN: < your_access_token > " "https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fmodels%2Fkey%2Erb/raw?ref=master"
2017-03-01 15:22:29 -05:00
```
2020-12-04 16:09:29 -05:00
NOTE:
2018-06-28 02:10:51 -04:00
Like [Get file from repository ](repository_files.md#get-file-from-repository ) you can use `HEAD` to get just file metadata.
2014-02-18 05:27:02 -05:00
## Create new file in repository
2022-04-04 14:08:38 -04:00
> The `execute_filemode` parameter was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83499) in GitLab 14.10.
2020-03-12 02:09:35 -04:00
This allows you to create a single file. For creating multiple files with a single request see the [commits API ](commits.md#create-a-commit-with-multiple-files-and-actions ).
2018-09-24 03:37:24 -04:00
2020-02-27 22:09:04 -05:00
```plaintext
2017-03-01 15:22:29 -05:00
POST /projects/:id/repository/files/:file_path
2014-02-18 05:27:02 -05:00
```
2022-02-15 04:17:01 -05:00
| Attribute | Type | Required | Description |
| ---------------- | -------------- | -------- | ----------- |
| `id` | integer or string | yes | The ID or [URL-encoded path of the project ](index.md#namespaced-path-encoding ) owned by the authenticated user. |
| `file_path` | string | yes | URL-encoded full path to new file. For example: `lib%2Fclass%2Erb` . |
| `branch` | string | yes | Name of the new branch to create. The commit is added to this branch. |
| `start_branch` | string | no | Name of the base branch to create the new branch from. |
| `encoding` | string | no | Change encoding to `base64` . Default is `text` . |
| `author_email` | string | no | The commit author's email address. |
| `author_name` | string | no | The commit author's name. |
| `content` | string | yes | The file's content. |
| `commit_message` | string | yes | The commit message. |
2022-04-04 14:08:38 -04:00
| `execute_filemode` | boolean | no | Enables or disables the `execute` flag on the file. Can be `true` or `false` . |
2021-11-22 13:10:55 -05:00
2020-01-30 10:09:15 -05:00
```shell
2021-06-02 11:09:59 -04:00
curl --request POST --header 'PRIVATE-TOKEN: < your_access_token > ' \
--header "Content-Type: application/json" \
2021-10-28 11:09:42 -04:00
--data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname",
2021-06-02 11:09:59 -04:00
"content": "some content", "commit_message": "create a new file"}' \
"https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fproject%2Erb"
2016-07-24 18:58:34 -04:00
```
2014-02-18 05:27:02 -05:00
Example response:
```json
{
2018-01-27 17:02:49 -05:00
"file_path": "app/project.rb",
2017-02-02 09:24:30 -05:00
"branch": "master"
2014-02-18 05:27:02 -05:00
}
```
## Update existing file in repository
2022-04-04 14:08:38 -04:00
> The `execute_filemode` parameter was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83499) in GitLab 14.10.
2020-03-12 02:09:35 -04:00
This allows you to update a single file. For updating multiple files with a single request see the [commits API ](commits.md#create-a-commit-with-multiple-files-and-actions ).
2018-09-24 03:37:24 -04:00
2020-02-27 22:09:04 -05:00
```plaintext
2017-03-01 15:22:29 -05:00
PUT /projects/:id/repository/files/:file_path
2014-02-18 05:27:02 -05:00
```
2022-02-15 04:17:01 -05:00
| Attribute | Type | Required | Description |
| ---------------- | -------------- | -------- | ----------- |
2021-11-22 13:10:55 -05:00
| `id` | integer or string | yes | The ID or [URL-encoded path of the project ](index.md#namespaced-path-encoding ) owned by the authenticated user |
2022-02-15 04:17:01 -05:00
| `file_path` | string | yes | URL-encoded full path to new file. For example: `lib%2Fclass%2Erb` . |
| `branch` | string | yes | Name of the new branch to create. The commit is added to this branch. |
| `start_branch` | string | no | Name of the base branch to create the new branch from. |
| `encoding` | string | no | Change encoding to `base64` . Default is `text` . |
| `author_email` | string | no | The commit author's email address. |
| `author_name` | string | no | The commit author's name. |
| `content` | string | yes | The file's content. |
| `commit_message` | string | yes | The commit message. |
| `last_commit_id` | string | no | Last known file commit ID. |
2022-04-04 14:08:38 -04:00
| `execute_filemode` | boolean | no | Enables or disables the `execute` flag on the file. Can be `true` or `false` . |
2021-11-22 13:10:55 -05:00
2020-01-30 10:09:15 -05:00
```shell
2021-06-02 11:09:59 -04:00
curl --request PUT --header 'PRIVATE-TOKEN: < your_access_token > ' \
--header "Content-Type: application/json" \
2021-10-28 11:09:42 -04:00
--data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname",
2021-06-02 11:09:59 -04:00
"content": "some content", "commit_message": "update file"}' \
"https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fproject%2Erb"
2016-07-24 18:58:34 -04:00
```
2014-02-18 05:27:02 -05:00
Example response:
```json
{
2018-01-27 17:02:49 -05:00
"file_path": "app/project.rb",
2017-02-02 09:24:30 -05:00
"branch": "master"
2014-02-18 05:27:02 -05:00
}
```
2014-08-06 08:28:22 -04:00
If the commit fails for any reason we return a 400 error with a non-specific
error message. Possible causes for a failed commit include:
2019-02-22 08:17:10 -05:00
2014-08-06 08:28:22 -04:00
- the `file_path` contained `/../` (attempted directory traversal);
2020-02-27 04:09:01 -05:00
- the new file contents were identical to the current file contents. That is, the
2014-08-06 08:28:22 -04:00
user tried to make an empty commit;
- the branch was updated by a Git push while the file edit was in progress.
2021-05-25 14:10:42 -04:00
GitLab Shell has a boolean return code, preventing GitLab from specifying the error.
2014-08-06 11:44:57 -04:00
2014-02-18 05:27:02 -05:00
## Delete existing file in repository
2020-03-12 02:09:35 -04:00
This allows you to delete a single file. For deleting multiple files with a single request, see the [commits API ](commits.md#create-a-commit-with-multiple-files-and-actions ).
2018-09-24 03:37:24 -04:00
2020-02-27 22:09:04 -05:00
```plaintext
2017-03-01 15:22:29 -05:00
DELETE /projects/:id/repository/files/:file_path
2014-02-18 05:27:02 -05:00
```
2022-02-15 04:17:01 -05:00
| Attribute | Type | Required | Description |
| ---------------- | -------------- | -------- | ----------- |
| `id` | integer or string | yes | The ID or [URL-encoded path of the project ](index.md#namespaced-path-encoding ) owned by the authenticated user. |
| `file_path` | string | yes | URL-encoded full path to new file. For example: `lib%2Fclass%2Erb` . |
| `branch` | string | yes | Name of the new branch to create. The commit is added to this branch. |
| `start_branch` | string | no | Name of the base branch to create the new branch from. |
| `author_email` | string | no | The commit author's email address. |
| `author_name` | string | no | The commit author's name. |
| `commit_message` | string | yes | The commit message. |
| `last_commit_id` | string | no | Last known file commit ID. |
2021-11-22 13:10:55 -05:00
2020-01-30 10:09:15 -05:00
```shell
2021-06-02 11:09:59 -04:00
curl --request DELETE --header 'PRIVATE-TOKEN: < your_access_token > ' \
--header "Content-Type: application/json" \
2021-10-28 11:09:42 -04:00
--data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname",
2021-06-02 11:09:59 -04:00
"commit_message": "delete file"}' \
"https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fproject%2Erb"
2016-07-24 18:58:34 -04:00
```