리포지터리 파일 API
GitLab v19.5Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
요약
이 API로 리포지터리 파일을 관리합니다. 개인 액세스 토큰은 다음 스코프를 지원합니다. 리포지터리에 있는 지정한 파일의 정보를 조회합니다. 10 MB보다 큰 blob의 경우 이 엔드포인트에는 분당 5회의 속도 제한이 적용됩니다.
이 API로 리포지터리 파일을 관리합니다. 이 API의 속도 제한을 구성할 수도 있습니다.
개인 액세스 토큰에 사용 가능한 스코프#
개인 액세스 토큰은 다음 스코프를 지원합니다.
| Scope | Description |
|---|---|
api |
리포지터리 파일에 대한 읽기·쓰기 액세스를 허용합니다. |
read_api |
리포지터리 파일에 대한 읽기 액세스를 허용합니다. |
read_repository |
리포지터리 파일에 대한 읽기 액세스를 허용합니다. |
리포지터리에서 파일 조회#
리포지터리에 있는 지정한 파일의 정보를 조회합니다. 이름, 크기, 파일 콘텐츠 같은 정보가 포함됩니다. 파일 콘텐츠는 Base64로 인코딩됩니다. 리포지터리가 공개되어 있으면 인증 없이 이 엔드포인트에 액세스할 수 있습니다.
10 MB보다 큰 blob의 경우 이 엔드포인트에는 분당 5회의 속도 제한이 적용됩니다.
GET /projects/:id/repository/files/:file_path
지원하는 속성은 다음과 같습니다.
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
file_path |
string | 예 | lib%2Fclass%2Erb와 같이 URL 인코딩된 파일의 전체 경로입니다. |
id |
integer or string | 예 | 프로젝트의 ID 또는 URL 인코딩된 경로입니다. |
ref |
string | 예 | 브랜치, 태그 또는 커밋의 이름입니다. 기본 브랜치를 자동으로 사용하려면 HEAD를 사용합니다. |
성공하면 200 OK와 다음 응답 속성을
반환합니다.
| 속성 | 유형 | 설명 |
|---|---|---|
blob_id |
string | Blob SHA 입니다. |
commit_id |
string | 파일의 커밋 SHA 입니다. |
content |
string | Base64로 인코딩된 파일 콘텐츠입니다. |
content_sha256 |
string | 반환된 content의 SHA256 해시입니다. |
encoding |
string | 파일 콘텐츠에 사용된 인코딩입니다. |
execute_filemode |
boolean | true 이면 파일에 실행 플래그가 설정되어 있습니다. |
file_name |
string | 파일의 이름입니다. |
file_path |
string | 파일의 전체 경로입니다. |
last_commit_id |
string | 이 파일을 마지막으로 수정한 커밋의 SHA 입니다. |
ref |
string | 사용된 브랜치, 태그 또는 커밋의 이름입니다. |
size |
integer | 원시 Git 블롭의 크기(바이트)입니다. |
Git에 유효한 UTF-8로 저장되지 않은 텍스트 파일(예: UTF-16 또는 ISO-8859-1)의 경우
content는 Base64로 인코딩되기 전에 UTF-8로 변환됩니다.
이러한 경우:
size는 원시 블롭 크기를 나타내며, 디코딩된 내용의 길이와 다를 수 있습니다.content_sha256은 원시 블롭이 아니라 변환된 콘텐츠의 해시입니다.git clone으로 받은 같은 파일이나 Download를 선택해 받은 파일의sha256sum과 일치하지 않을 수 있습니다.
Git에 저장된 정확한 바이트를 가져오려면 원시 파일 엔드포인트를 사용합니다.
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fmodels%2Fkey%2Erb?ref=main"
브랜치 이름을 모르거나 기본 브랜치를 사용하려면 ref 값으로 HEAD를 사용할 수
있습니다. 예를 들면 다음과 같습니다.
curl --header "PRIVATE-TOKEN: " \
--url "https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fmodels%2Fkey%2Erb?ref=HEAD"
응답 예시:
{
"file_name": "key.rb",
"file_path": "app/models/key.rb",
"size": 1476,
"encoding": "base64",
"content": "IyA9PSBTY2hlbWEgSW5mb3...",
"content_sha256": "4c294617b60715c1d218e61164a3abd4808a4284cbc30e6728a01ad9aada4481",
"ref": "main",
"blob_id": "79f7bbd25901e8334750839545a9bd021f0e4c83",
"commit_id": "d5a3ff139356ce33e37e73add446f16869741b50",
"last_commit_id": "570e7b2abdd848b95f2f578043fc23bd6f6fd24d",
"execute_filemode": false
}
파일 메타데이터만 가져오기#
HEAD를 사용해 파일 메타데이터만 가져올 수도 있습니다.
HEAD /projects/:id/repository/files/:file_path
curl --head --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fmodels%2Fkey%2Erb?ref=main"
응답 예시:
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: main
X-Gitlab-Size: 1476
X-Gitlab-Execute-Filemode: false
...
리포지터리에서 파일 blame 히스토리 조회#
리포지터리에 있는 지정한 파일의 blame 히스토리를 조회합니다. 각 blame 범위에는 라인과 해당 라인의 커밋 정보가 들어 있습니다.
GET /projects/:id/repository/files/:file_path/blame
지원하는 속성은 다음과 같습니다.
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
file_path |
string | 예 | lib%2Fclass%2Erb와 같이 URL 인코딩된 파일의 전체 경로입니다. |
id |
integer or string | 예 | 프로젝트의 ID 또는 URL 인코딩된 경로입니다. |
ref |
string | 예 | 브랜치, 태그 또는 커밋의 이름입니다. 기본 브랜치를 자동으로 사용하려면 HEAD를 사용합니다. |
range |
hash | 아니요 | blame 범위입니다. |
range[end] |
integer | 아니요 | blame을 적용할 범위의 마지막 라인입니다. |
range[start] |
integer | 아니요 | blame을 적용할 범위의 첫 라인입니다. |
성공하면 200 OK와 다음 응답 속성을
반환합니다.
| 속성 | 유형 | 설명 |
|---|---|---|
commit |
object | 해당 blame 범위의 커밋 정보입니다. |
lines |
array | 해당 blame 범위의 라인 배열입니다. |
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/13083/repository/files/path%2Fto%2Ffile.rb/blame?ref=main"
응답 예시:
[
{
"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'",
""
]
}
]
파일 blame 메타데이터만 가져오기#
파일의 blame 메타데이터만 반환하려면 HEAD 메서드를 사용합니다.
HEAD /projects/:id/repository/files/:file_path/blame
curl --head --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/13083/repository/files/path%2Fto%2Ffile.rb/blame?ref=main"
응답 예시:
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: main
X-Gitlab-Size: 1476
X-Gitlab-Execute-Filemode: false
...
blame 범위 요청#
blame 범위를 요청하려면 파일의 시작 라인 번호와 끝 라인 번호를 range[start] 및
range[end] 파라미터로 지정합니다.
curl --head --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/13083/repository/files/path%2Fto%2Ffile.rb/blame?ref=main&range[start]=1&range[end]=2"
응답 예시:
[
{
"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'"
]
}
]
리포지터리에서 원본 파일 조회#
리포지터리에 있는 지정한 파일의 원본 콘텐츠를 조회합니다.
GET /projects/:id/repository/files/:file_path/raw
지원하는 속성은 다음과 같습니다.
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
file_path |
string | 예 | lib%2Fclass%2Erb와 같이 URL 인코딩된 파일의 전체 경로입니다. |
id |
integer or string | 예 | 프로젝트의 ID 또는 URL 인코딩된 경로입니다. |
lfs |
boolean | 아니요 | true 이면 응답으로 포인터 대신 Git LFS 파일 콘텐츠를 반환할지 결정합니다. 파일이 Git LFS로 추적되지 않으면 무시됩니다. 기본값은 false 입니다. |
ref |
string | 아니요 | 브랜치, 태그 또는 커밋의 이름입니다. 기본값은 프로젝트의 HEAD 입니다. |
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fmodels%2Fkey%2Erb/raw?ref=main"
리포지터리에서 파일 조회와 마찬가지로
HEAD를 사용해 파일 메타데이터만 가져올 수 있습니다.
리포지터리에 파일 생성#
히스토리
- GitLab 18.7에서 요청 크기 제한과 속도 제한이 도입되었습니다.
지정한 리포지터리에 파일을 생성합니다. 한 번의 요청으로 여러 파일을 생성하려면 커밋 API를 참고합니다.
POST /projects/:id/repository/files/:file_path
이 엔드포인트에는 요청 크기 제한과 속도 제한이 적용됩니다. 기본 제한값인 300 MB보다 큰 요청은 거부됩니다. 20 MB를 초과하는 요청에는 30초당 3회의 속도 제한이 적용됩니다.
지원하는 속성은 다음과 같습니다.
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
branch |
string | 예 | 생성할 브랜치의 이름입니다. 커밋이 이 브랜치에 추가됩니다. |
commit_message |
string | 예 | 커밋 메시지입니다. |
content |
string | 예 | 파일의 콘텐츠입니다. |
file_path |
string | 예 | URL 인코딩된 파일의 전체 경로입니다. 예: lib%2Fclass%2Erb. |
id |
integer or string | 예 | 프로젝트의 ID 또는 URL 인코딩된 경로입니다. |
author_email |
string | 아니요 | 커밋 작성자의 이메일 주소입니다. |
author_name |
string | 아니요 | 커밋 작성자의 이름입니다. |
encoding |
string | 아니요 | 인코딩을 base64로 변경합니다. 기본값은 text 입니다. |
execute_filemode |
boolean | 아니요 | true 이면 파일의 execute 플래그를 활성화합니다. false 이면 파일의 execute 플래그를 비활성화합니다. |
start_branch |
string | 아니요 | 브랜치를 생성할 기준이 되는 베이스 브랜치의 이름입니다. |
성공하면 201 Created와 다음 응답 속성을
반환합니다.
| 속성 | 유형 | 설명 |
|---|---|---|
branch |
string | 파일이 생성된 브랜치의 이름입니다. |
file_path |
string | 생성된 파일의 경로입니다. |
curl --request POST \
--header 'PRIVATE-TOKEN: <your_access_token>' \
--header "Content-Type: application/json" \
--data '{"branch": "main", "author_email": "author@example.com", "author_name": "Firstname Lastname",
"content": "some content", "commit_message": "create a new file"}' \
--url "https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fproject%2Erb"
응답 예시:
{
"file_path": "app/project.rb",
"branch": "main"
}
리포지터리의 파일 업데이트#
히스토리
- GitLab 18.7에서 요청 크기 제한과 속도 제한이 도입되었습니다.
리포지터리에 있는 지정한 파일을 업데이트합니다. 한 번의 요청으로 여러 파일을 업데이트하려면 커밋 API를 참고합니다.
PUT /projects/:id/repository/files/:file_path
이 엔드포인트에는 요청 크기 제한과 속도 제한이 적용됩니다. 기본 제한값인 300 MB보다 큰 요청은 거부됩니다. 20 MB를 초과하는 요청에는 30초당 3회의 속도 제한이 적용됩니다.
지원하는 속성은 다음과 같습니다.
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
branch |
string | 예 | 생성할 브랜치의 이름입니다. 커밋이 이 브랜치에 추가됩니다. |
commit_message |
string | 예 | 커밋 메시지입니다. |
content |
string | 예 | 파일의 콘텐츠입니다. |
file_path |
string | 예 | URL 인코딩된 파일의 전체 경로입니다. 예: lib%2Fclass%2Erb. |
id |
integer or string | 예 | 프로젝트의 ID 또는 URL 인코딩된 경로 |
author_email |
string | 아니요 | 커밋 작성자의 이메일 주소입니다. |
author_name |
string | 아니요 | 커밋 작성자의 이름입니다. |
encoding |
string | 아니요 | 인코딩을 base64로 변경합니다. 기본값은 text 입니다. |
execute_filemode |
boolean | 아니요 | true 이면 파일의 execute 플래그를 활성화합니다. false 이면 파일의 execute 플래그를 비활성화합니다. |
last_commit_id |
string | 아니요 | 마지막으로 알려진 파일 커밋 ID 입니다. |
start_branch |
string | 아니요 | 브랜치를 생성할 기준이 되는 베이스 브랜치의 이름입니다. |
성공하면 200 OK와 다음 응답 속성을
반환합니다.
| 속성 | 유형 | 설명 |
|---|---|---|
branch |
string | 파일이 업데이트된 브랜치의 이름입니다. |
file_path |
string | 업데이트된 파일의 경로입니다. |
curl --request PUT \
--header 'PRIVATE-TOKEN: <your_access_token>' \
--header "Content-Type: application/json" \
--data '{"branch": "main", "author_email": "author@example.com", "author_name": "Firstname Lastname",
"content": "some content", "commit_message": "update file"}' \
--url "https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fproject%2Erb"
응답 예시:
{
"file_path": "app/project.rb",
"branch": "main"
}
어떤 이유로든 커밋이 실패하면 API는 구체적이지 않은 오류 메시지와 함께
400 Bad Request 오류를 반환합니다. 커밋 실패의 원인으로는 다음이 있습니다.
file_path에/../가 포함된 경우(디렉터리 트래버설 시도).- 커밋이 비어 있는 경우. 새 파일 콘텐츠가 현재 파일 콘텐츠와 동일합니다.
- 파일을 편집하는 동안 다른 사용자가
git push로 브랜치를 업데이트한 경우.
GitLab Shell은 Boolean 반환 코드를 사용하므로 GitLab 이 오류를 구체적으로 지정하지 못합니다.
리포지터리의 파일 삭제#
리포지터리에 있는 지정한 파일을 삭제합니다. 한 번의 요청으로 여러 파일을 삭제하려면 커밋 API를 참고합니다.
DELETE /projects/:id/repository/files/:file_path
지원하는 속성은 다음과 같습니다.
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
branch |
string | 예 | 생성할 브랜치의 이름입니다. 커밋이 이 브랜치에 추가됩니다. |
commit_message |
string | 예 | 커밋 메시지입니다. |
file_path |
string | 예 | URL 인코딩된 파일의 전체 경로입니다. 예: lib%2Fclass%2Erb. |
id |
integer or string | 예 | 프로젝트의 ID 또는 URL 인코딩된 경로입니다. |
author_email |
string | 아니요 | 커밋 작성자의 이메일 주소입니다. |
author_name |
string | 아니요 | 커밋 작성자의 이름입니다. |
last_commit_id |
string | 아니요 | 마지막으로 알려진 파일 커밋 ID 입니다. |
start_branch |
string | 아니요 | 브랜치를 생성할 기준이 되는 베이스 브랜치의 이름입니다. |
성공하면 200 OK를 반환합니다.
curl --request DELETE \
--header 'PRIVATE-TOKEN: <your_access_token>' \
--header "Content-Type: application/json" \
--data '{"branch": "main", "author_email": "author@example.com", "author_name": "Firstname Lastname",
"commit_message": "delete file"}' \
--url "https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fproject%2Erb"