저장소 API
GitLab v19.5Offering: GitLab.com, GitLab Self-Managed
요약
이 API를 사용하여 Git 리포지터리를 관리합니다. 지정된 프로젝트의 모든 리포지터리 파일과 디렉터리를 나열합니다. 이 명령은 git ls-tree 명령과 본질적으로 동일한 기능을 제공합니다. GitLab 17.7 버전에서는 요청한 경로를 찾지 못했을 때의 오류 처리 방식이 변경되었습니다.
이 API를 사용하여 Git 리포지터리를 관리합니다.
프로젝트의 모든 리포지터리 트리 목록 조회#
히스토리
with_last_commit속성이 GitLab 19.3에서 도입되었습니다.
지정된 프로젝트의 모든 리포지터리 파일과 디렉터리를 나열합니다. 리포지터리가 공개되어 있으면 인증 없이 이 엔드포인트에 접근할 수 있습니다.
이 명령은 git ls-tree 명령과 본질적으로 동일한 기능을 제공합니다.
자세한 내용은 Git 내부 구조 문서의
tree 오브젝트
항목을 참고합니다.
GitLab 17.7 버전에서는 요청한 경로를 찾지 못했을 때의 오류 처리 방식이 변경되었습니다.
이제 엔드포인트는 상태 코드 404 Not Found를 반환합니다. 이전에는 상태 코드가 200 OK였습니다.
존재하지 않는 경로에 대해 빈 배열과 함께 200 상태 코드를 받는 것에 구현이 의존하고 있다면,
새로운 404 응답을 처리하도록 오류 처리를 수정해야 합니다.
GET /projects/:id/repository/tree
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
id |
integer or string | 예 | 프로젝트의 ID 또는 URL 인코딩된 경로. |
page_token |
string | 아니요 | 다음 페이지를 가져올 트리 레코드 ID. keyset 페이지네이션에서만 사용합니다. |
pagination |
string | 아니요 | keyset이면 keyset 기반 페이지네이션 방식을 사용합니다. |
path |
string | 아니요 | 리포지터리 내부 경로. 하위 디렉터리의 내용을 가져올 때 사용합니다. |
per_page |
integer | 아니요 | 페이지당 표시할 결과 수. 지정하지 않으면 기본값은 20입니다. 자세한 내용은 페이지네이션을 참고합니다. |
recursive |
boolean | 아니요 | true이면 트리를 재귀적으로 가져옵니다. 기본값은 false입니다. |
ref |
string | 아니요 | 리포지터리 브랜치 또는 태그 이름. 지정하지 않으면 기본 브랜치를 사용합니다. |
with_last_commit |
boolean | 아니요 | true이면 각 트리 항목의 마지막 커밋을 포함합니다. recursive와 함께 사용할 수 없습니다. 기본값은 false입니다. |
성공하면 200 OK와 트리 오브젝트 배열을 반환합니다.
with_last_commit이 true이면 각 트리 오브젝트에 해당 항목을 마지막으로 변경한 커밋의
상세 정보를 담은 last_commit 오브젝트가 포함됩니다. last_commit 오브젝트는
커밋 API와 동일한 속성을 사용합니다.
요청 예시:
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/13083/repository/tree"
응답 예시:
[
{
"id": "a1e8f8d745cc87e3a9248358d9352bb7f9a0aeba",
"name": "html",
"type": "tree",
"path": "files/html",
"mode": "040000"
},
{
"id": "4535904260b1082e14f867f7a24fd8c21495bde3",
"name": "images",
"type": "tree",
"path": "files/images",
"mode": "040000"
},
{
"id": "31405c5ddef582c5a9b7a85230413ff90e2fe720",
"name": "js",
"type": "tree",
"path": "files/js",
"mode": "040000"
},
{
"id": "cc71111cfad871212dc99572599a568bfe1e7e00",
"name": "lfs",
"type": "tree",
"path": "files/lfs",
"mode": "040000"
},
{
"id": "fd581c619bf59cfdfa9c8282377bb09c2f897520",
"name": "markdown",
"type": "tree",
"path": "files/markdown",
"mode": "040000"
},
{
"id": "23ea4d11a4bdd960ee5320c5cb65b5b3fdbc60db",
"name": "ruby",
"type": "tree",
"path": "files/ruby",
"mode": "040000"
},
{
"id": "7d70e02340bac451f281cecf0a980907974bd8be",
"name": "whitespace",
"type": "blob",
"path": "files/whitespace",
"mode": "100644"
}
]
with_last_commit을 사용한 요청 예시:
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/13083/repository/tree?with_last_commit=true"
응답 예시:
[
{
"id": "a1e8f8d745cc87e3a9248358d9352bb7f9a0aeba",
"name": "html",
"type": "tree",
"path": "files/html",
"mode": "040000",
"last_commit": {
"id": "913c66a37b4a45b9769037c55c2d238bd0942d2e",
"short_id": "913c66a3",
"created_at": "2014-02-27T10:14:56.000+02:00",
"parent_ids": [
"cfe32cf61b73a0d5e9f13e774abde7ff789b1660"
],
"title": "Files, encoding and much more",
"message": "Files, encoding and much more\n",
"author_name": "Dmitriy Zaporozhets",
"author_email": "dmitriy.zaporozhets@gmail.com",
"authored_date": "2014-02-27T10:14:56.000+02:00",
"committer_name": "Dmitriy Zaporozhets",
"committer_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-02-27T10:14:56.000+02:00",
"trailers": {},
"extended_trailers": {},
"web_url": "https://gitlab.example.com/example-group/example-project/-/commit/913c66a37b4a45b9769037c55c2d238bd0942d2e"
}
}
]
리포지터리에서 블롭 조회#
리포지터리에 있는 블롭의 크기와 내용 같은 정보를 조회합니다. 블롭 내용은 Base64로 인코딩됩니다. 리포지터리가 공개되어 있으면 인증 없이 이 엔드포인트에 접근할 수 있습니다.
10 MB보다 큰 블롭의 경우 이 엔드포인트에는 분당 5회 요청의 속도 제한이 적용됩니다.
GET /projects/:id/repository/blobs/:sha
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
id |
integer or string | 예 | 프로젝트의 ID 또는 URL 인코딩된 경로. |
sha |
string | 예 | 블롭 SHA. |
성공하면 200 OK와 다음 응답 속성을
반환합니다:
| 속성 | 유형 | 설명 |
|---|---|---|
content |
string | Base64로 인코딩된 블롭 내용. |
encoding |
string | 블롭 내용에 사용된 인코딩. |
sha |
string | 블롭 SHA. |
size |
integer | 원시 Git 블롭의 바이트 단위 크기. |
Git에 유효한 UTF-8로 저장되지 않은 텍스트 파일(예: UTF-16 또는 ISO-8859-1)의 경우
content는 Base64로 인코딩되기 전에 UTF-8로 변환됩니다.
이러한 경우 size는 원시 블롭 크기를 나타내며, 디코딩된 내용의 길이와 다를 수 있습니다.
Git에 저장된 정확한 바이트를 가져오려면 원시 블롭 엔드포인트를 사용합니다.
요청 예시:
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/13083/repository/blobs/79f7bbd25901e8334750839545a9bd021f0e4c83"
응답 예시:
{
"size": 1476,
"encoding": "base64",
"content": "VGhpcyBpcyBhIGJpbmFyeSBmaWxl",
"sha": "79f7bbd25901e8334750839545a9bd021f0e4c83"
}
원시 블롭 내용 조회#
블롭 SHA로 블롭의 원시 파일 내용을 조회합니다. 리포지터리가 공개되어 있으면 인증 없이 이 엔드포인트에 접근할 수 있습니다.
GET /projects/:id/repository/blobs/:sha/raw
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
id |
integer or string | 예 | 프로젝트의 ID 또는 URL 인코딩된 경로. |
sha |
string | 예 | 블롭 SHA. |
요청 예시:
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/13083/repository/blobs/79f7bbd25901e8334750839545a9bd021f0e4c83/raw"
단일 요청으로 여러 블롭 조회#
히스토리
이 기능의 제공 여부는 기능 플래그로 제어됩니다. 자세한 내용은 히스토리를 참고합니다. 이 기능은 테스트용으로 제공되며 운영 환경에서 사용할 준비는 되지 않았습니다.
한 번의 요청으로 최대 20개 파일의 내용을 조회합니다. 요청한 각 파일은 브랜치, 태그 또는 커밋을 기준으로 확인됩니다. 블롭 내용은 Base64로 인코딩됩니다.
이 엔드포인트는 인증이 필요합니다. 인증되지 않은 요청은
401 Unauthorized로 거부됩니다. 기능 플래그가
비활성화되어 있으면 엔드포인트는 404 Not Found를 반환합니다.
이 엔드포인트에는 사용자별, 프로젝트별 속도 제한이 적용됩니다. 기본값은 분당 5회
요청이며, project_repositories_blobs_batch_limit
애플리케이션 설정으로 변경할 수 있습니다.
각 블롭은 내용의 처음 1 MB까지만 잘려서 반환됩니다. 블롭이 잘린 경우
truncated 필드는 true이고 size는 블롭 전체 크기를 바이트 단위로 보고합니다.
요청한 참조에 존재하지 않는 파일은 응답에서 제외됩니다.
POST /projects/:id/repository/blobs/batch
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
id |
integer or string | 예 | 프로젝트의 ID 또는 URL 인코딩된 경로. |
files |
array | 예 | 조회할 파일 오브젝트 배열. 최대 20개. |
files[].path |
string | 예 | 리포지터리에 있는 파일의 경로. |
files[].ref |
string | 아니요 | 브랜치, 태그 또는 커밋. 기본값은 기본 브랜치. |
성공하면 200 OK와 확인된 각 파일에 대한
다음 응답 속성을 담은 배열을 반환합니다:
| 속성 | 유형 | 설명 |
|---|---|---|
content |
string | Base64로 인코딩된 블롭 내용. |
encoding |
string | 블롭 내용에 사용된 인코딩. |
path |
string | 리포지터리에 있는 파일의 경로. |
ref |
string | 파일을 확인한 기준 참조. |
size |
integer | 블롭의 전체 크기(바이트). |
truncated |
boolean | content가 블롭의 처음 1 MB로 잘렸는지 여부. |
요청 예시:
curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--data '{"files": [{"path": "README.md"}, {"path": "config/database.yml", "ref": "main"}]}' \
--url "https://gitlab.example.com/api/v4/projects/13083/repository/blobs/batch"
응답 예시:
[
{
"path": "README.md",
"ref": "main",
"size": 1476,
"truncated": false,
"encoding": "base64",
"content": "VGhpcyBpcyBhIGJpbmFyeSBmaWxl"
}
]
리포지터리에서 파일 아카이브 조회#
지정된 리포지터리의 파일 아카이브를 조회합니다. 리포지터리가 공개되어 있으면 인증 없이 이 엔드포인트에 접근할 수 있습니다.
GitLab.com 사용자의 경우 이 엔드포인트에는 분당 5회 요청의 속도 제한 임계값이 적용됩니다.
GET /projects/:id/repository/archive[.format]
format은 아카이브 형식을 지정하는 선택적 접미사이며 기본값은
tar.gz입니다. 예를 들어 archive.zip을 지정하면 ZIP 형식의 아카이브가 전송됩니다.
사용할 수 있는 옵션은 다음과 같습니다:
bz2tartar.bz2tar.gztb2tbztbz2zip
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
id |
integer or string | 예 | 프로젝트의 ID 또는 URL 인코딩된 경로. |
exclude_paths |
string | 아니요 | 아카이브에서 제외할 경로를 쉼표로 구분한 목록. |
include_lfs_blobs |
boolean | 아니요 | true이면 LFS 오브젝트가 아카이브에 포함됩니다. false로 설정하면 LFS 오브젝트가 제외됩니다. 기본값은 true입니다. |
path |
string | 아니요 | 다운로드할 리포지터리의 하위 경로. 빈 문자열이면 리포지터리 전체가 기본값입니다. |
sha |
string | 아니요 | 다운로드할 커밋 SHA. 태그, 브랜치 참조 또는 SHA를 사용할 수 있습니다. 지정하지 않으면 기본 브랜치의 최신 커밋이 기본값입니다. |
ref_type |
string | 아니요 | sha에 지정한 ref의 유형. 브랜치와 태그의 이름이 같을 때 올바른 ref를 선택하는 데 사용합니다. |
요청 예시:
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.com/api/v4/projects/<project_id>/repository/archive?sha=<commit_sha>&path=<path>&exclude_paths=<path1,path2>"
브랜치, 태그 또는 커밋 비교#
히스토리
collapsed및too_large응답 속성이 GitLab 18.4에서 도입되었습니다.
지정된 프로젝트에서 두 브랜치, 태그 또는 커밋 사이의 차이를 조회합니다. 리포지터리가 공개되어 있으면 인증 없이 이 엔드포인트에 접근할 수 있습니다.
compare_timeout이 true이면 비교가 크기 제한을 초과했거나
시간이 초과된 것입니다:
commits배열은 항상 완전합니다.diffs배열은 불완전할 수 있습니다.- 개별 diff 오브젝트는 내용이 제한을 초과한 경우
diff문자열이 비어 있을 수 있습니다.
GET /projects/:id/repository/compare
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
from |
string | 예 | 커밋 SHA 또는 브랜치 이름. |
id |
integer or string | 예 | 프로젝트의 ID 또는 URL 인코딩된 경로. |
to |
string | 예 | 커밋 SHA 또는 브랜치 이름. |
from_project_id |
integer | 아니요 | 비교 기준이 되는 프로젝트의 ID. |
straight |
boolean | 아니요 | true이면 from과 to를 직접 비교하는 방식(from..to)을 사용합니다. false이면 머지 베이스를 기준으로 비교합니다(from...to). 기본값은 false입니다. |
unidiff |
boolean | 아니요 | true이면 diff를 통합 diff 형식으로 표시합니다. 기본값은 false입니다. |
성공하면 200 OK와 다음
응답 속성을 반환합니다:
| 속성 | 유형 | 설명 |
|---|---|---|
commit |
object | 비교 대상 중 가장 최근 커밋의 상세 정보. |
commits |
object array | 두 참조 사이의 커밋. compare_timeout이 true여도 항상 완전합니다. |
commits[].author_email |
string | 커밋 작성자의 이메일 주소. |
commits[].author_name |
string | 커밋 작성자의 이름. |
commits[].created_at |
datetime | 커밋 생성 타임스탬프. |
commits[].id |
string | 전체 커밋 SHA. |
commits[].short_id |
string | 짧은 커밋 SHA. |
commits[].title |
string | 커밋 제목. |
compare_same_ref |
boolean | true이면 비교의 시작과 끝에 같은 참조를 사용한 것입니다. |
compare_timeout |
boolean | true이면 비교가 크기 제한을 초과했거나 시간이 초과된 것입니다. diffs 배열이 불완전할 수 있습니다. |
diffs |
object array | 파일 차이 목록. |
diffs[].a_mode |
string | 이전 파일 모드. |
diffs[].b_mode |
string | 새 파일 모드. |
diffs[].collapsed |
boolean | true이면 파일 diff가 제외되었으나 요청하면 가져올 수 있습니다. |
diffs[].deleted_file |
boolean | true이면 파일이 제거되었습니다. |
diffs[].diff |
string | 파일의 변경 사항을 보여주는 diff 내용. |
diffs[].new_file |
boolean | true이면 파일이 추가되었습니다. |
diffs[].new_path |
string | 파일의 새 경로. |
diffs[].old_path |
string | 파일의 이전 경로. |
diffs[].renamed_file |
boolean | true이면 파일 이름이 변경되었습니다. |
diffs[].too_large |
boolean | true이면 파일 diff가 제외되었고 조회할 수 없습니다. |
web_url |
string | 비교 결과를 확인할 수 있는 웹 URL. |
요청 예시:
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/5/repository/compare?from=main&to=feature"
응답 예시:
{
"commit": {
"id": "12d65c8dd2b2676fa3ac47d955accc085a37a9c1",
"short_id": "12d65c8dd2b",
"title": "JS fix",
"author_name": "Example User",
"author_email": "user@example.com",
"created_at": "2014-02-27T10:27:00+02:00"
},
"commits": [{
"id": "12d65c8dd2b2676fa3ac47d955accc085a37a9c1",
"short_id": "12d65c8dd2b",
"title": "JS fix",
"author_name": "Example User",
"author_email": "user@example.com",
"created_at": "2014-02-27T10:27:00+02:00"
}],
"diffs": [{
"old_path": "files/js/application.js",
"new_path": "files/js/application.js",
"a_mode": null,
"b_mode": "100644",
"diff": "@@ -24,8 +24,10 @@\n //= require g.raphael-min\n //= require g.bar-min\n //= require branch-graph\n-//= require highlightjs.min\n-//= require ace/ace\n //= require_tree .\n //= require d3\n //= require underscore\n+\n+function fix() { \n+ alert(\"Fixed\")\n+}",
"collapsed": false,
"too_large": false,
"new_file": false,
"renamed_file": false,
"deleted_file": false
}],
"compare_timeout": false,
"compare_same_ref": false,
"web_url": "https://gitlab.example.com/janedoe/gitlab-foss/-/compare/ae73cb07c9eeaf35924a10f713b364d32b2dd34f...0b4bc9a49b562e85de7cc9e834518ea6828729b9"
}
기여자 목록 조회#
히스토리
ref가 GitLab 17.4에서 도입되었습니다.
리포지터리 기여자 목록을 조회합니다. 리포지터리가 공개되어 있으면 인증 없이 이 엔드포인트에 접근할 수 있습니다.
반환되는 커밋 수에는 머지 커밋이 포함되지 않습니다.
GET /projects/:id/repository/contributors
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
id |
integer or string | 예 | 프로젝트의 ID 또는 URL 인코딩된 경로. |
order_by |
string | 아니요 | 기여자를 name, email 또는 commits(커밋 수) 기준으로 정렬합니다. 지정하지 않으면 커밋 날짜순으로 정렬합니다. |
ref |
string | 아니요 | 리포지터리 브랜치 또는 태그 이름. 지정하지 않으면 기본 브랜치를 사용합니다. |
sort |
string | 아니요 | 기여자를 asc 또는 desc 순서로 정렬해 반환합니다. 기본값은 asc입니다. |
성공하면 200 OK와 다음
응답 속성을 반환합니다:
| 속성 | 유형 | 설명 |
|---|---|---|
additions |
integer | 기여자가 추가한 줄 수. |
commits |
integer | 기여자의 커밋 수. |
deletions |
integer | 기여자가 삭제한 줄 수. |
email |
string | 기여자의 이메일 주소. |
name |
string | 기여자의 이름. |
요청 예시:
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/7/repository/contributors"
응답 예시:
[{
"name": "Example User",
"email": "example@example.com",
"commits": 117,
"additions": 0,
"deletions": 0
}, {
"name": "Sample User",
"email": "sample@example.com",
"commits": 33,
"additions": 0,
"deletions": 0
}]
머지 베이스 조회#
커밋 SHA, 브랜치 이름, 태그와 같은 2개 이상의 ref에 대한 공통 조상을 조회합니다.
GET /projects/:id/repository/merge_base
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
id |
integer or string | 예 | 프로젝트의 ID 또는 URL 인코딩된 경로. |
refs |
array | 예 | 공통 조상을 찾을 ref. 여러 개의 ref를 지정할 수 있습니다. |
성공하면 200 OK와 다음
응답 속성을 반환합니다:
| 속성 | 유형 | 설명 |
|---|---|---|
author_email |
string | 작성자의 이메일 주소. |
author_name |
string | 작성자의 이름. |
authored_date |
datetime | 커밋이 작성된 날짜. |
committed_date |
datetime | 커밋이 커밋된 날짜. |
committer_email |
string | 커미터의 이메일 주소. |
committer_name |
string | 커미터의 이름. |
created_at |
datetime | 커밋 생성 타임스탬프. |
extended_trailers |
object | Git 트레일러에 대한 확장 정보. |
id |
string | 전체 커밋 SHA. |
message |
string | 전체 커밋 메시지. |
parent_ids |
array | 부모 커밋 SHA 목록. |
short_id |
string | 짧은 커밋 SHA. |
title |
string | 커밋 제목. |
trailers |
object | 커밋 메시지에서 파싱한 Git 트레일러. |
web_url |
string | GitLab 웹 인터페이스에서 커밋을 확인할 수 있는 URL. |
가독성을 위해 ref를 줄인 요청 예시:
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/5/repository/merge_base?refs[]=304d257d&refs[]=0031876f"
응답 예시:
{
"id": "1a0b36b3cdad1d2ee32457c102a8c0b7056fa863",
"short_id": "1a0b36b3",
"title": "Initial commit",
"created_at": "2014-02-27T08:03:18.000Z",
"parent_ids": [],
"message": "Initial commit\n",
"author_name": "Example User",
"author_email": "user@example.com",
"authored_date": "2014-02-27T08:03:18.000Z",
"committer_name": "Example User",
"committer_email": "user@example.com",
"committed_date": "2014-02-27T08:03:18.000Z",
"trailers": {},
"extended_trailers": {},
"web_url": "https://gitlab.example.com/example-group/example-project/-/commit/1a0b36b3cdad1d2ee32457c102a8c0b7056fa863"
}
diff 통계 조회#
이 기능의 제공 여부는 기능 플래그로 제어됩니다. 자세한 내용은 히스토리를 참고합니다.
두 ref 사이에서 서로 다른 각 파일의 추가된 줄 수와 삭제된 줄 수를 조회합니다.
이 엔드포인트는 인증이 필요합니다.
인증되지 않은 요청은 401 Unauthorized로 거부됩니다.
page 및 per_page 페이지네이션 파라미터로
결과의 페이지네이션을 제어합니다.
GET /projects/:id/repository/diff_stats
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
id |
integer or string | 예 | 프로젝트의 ID 또는 URL 인코딩된 경로. |
from |
string | 예 | 비교 기준이 되는 ref. 커밋 SHA, 브랜치 이름 또는 태그 이름을 사용할 수 있습니다. 최대 길이는 255자입니다. |
to |
string | 예 | 비교 대상이 되는 ref. 커밋 SHA, 브랜치 이름 또는 태그 이름을 사용할 수 있습니다. 최대 길이는 255자입니다. |
성공하면 200 OK와 다음 응답 속성을 담은
diff 통계 배열을 반환합니다:
| 속성 | 유형 | 설명 |
|---|---|---|
additions |
integer | 추가된 줄 수. |
deletions |
integer | 삭제된 줄 수. |
old_path |
string | 파일의 이전 경로. 파일 이름이 변경된 경우 path와 다릅니다. |
path |
string | 파일의 경로. |
다음 상태 코드를 반환할 수 있습니다:
400 Bad Request:from또는to가 없거나 최대 길이를 초과했습니다.401 Unauthorized: 요청이 인증되지 않았습니다.403 Forbidden: 이 프로젝트에서 리포지터리 내용을 비교할 권한이 없거나 리포지터리가 비활성화되어 있습니다.404 Not Found: 프로젝트가 존재하지 않거나 사용자에게 보이지 않거나, 지정한 ref가 존재하지 않거나,repository_diff_stats_api기능 플래그가 비활성화되어 있습니다.429 Too Many Requests: 이 엔드포인트의 속도 제한을 초과했습니다.
요청 예시:
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/5/repository/diff_stats?from=main&to=feature"
응답 예시:
[
{
"old_path": "app/models/user.rb",
"path": "app/models/user.rb",
"additions": 15,
"deletions": 4
},
{
"old_path": "app/assets/javascripts/pages/users/index.js",
"path": "app/assets/javascripts/pages/users/show.js",
"additions": 8,
"deletions": 0
},
{
"old_path": "spec/models/user_spec.rb",
"path": "spec/models/user_spec.rb",
"additions": 22,
"deletions": 3
}
]
분기된 커밋 수 조회#
히스토리
이 기능의 제공 여부는 기능 플래그로 제어됩니다. 자세한 내용은 히스토리를 참고합니다.
두 ref가 몇 개의 커밋만큼 분기했는지 조회합니다. 각 수치는 서로를 기준으로 계산됩니다:
behind는from에는 있고to에는 없는 커밋 수입니다.ahead는to에는 있고from에는 없는 커밋 수입니다.
이 엔드포인트는 인증이 필요합니다.
인증되지 않은 요청은 401 Unauthorized로 거부됩니다.
GET /projects/:id/repository/diverging_commits
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
id |
integer or string | 예 | 프로젝트의 ID 또는 URL 인코딩된 경로. |
from |
string | 예 | 비교 기준이 되는 ref. 커밋 SHA, 브랜치 이름 또는 태그 이름을 사용할 수 있습니다. |
to |
string | 예 | 비교 대상이 되는 ref. 커밋 SHA, 브랜치 이름 또는 태그 이름을 사용할 수 있습니다. |
max_count |
integer | 아니요 | 계산할 최대 커밋 수. 제한을 두지 않으려면 0을 사용합니다. 기본값은 0입니다. |
성공하면 200 OK와 다음
응답 속성을 반환합니다:
| 속성 | 유형 | 설명 |
|---|---|---|
ahead |
integer | to에는 있고 from에는 없는 커밋 수. |
behind |
integer | from에는 있고 to에는 없는 커밋 수. |
요청 예시:
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/5/repository/diverging_commits?from=main&to=feature"
응답 예시:
{
"behind": 3,
"ahead": 5
}
변경된 경로 조회#
히스토리
이 기능의 제공 여부는 기능 플래그로 제어됩니다. 자세한 내용은 히스토리를 참고합니다.
두 커밋, 브랜치 또는 태그 사이에 변경된 파일 목록을 조회합니다.
이 엔드포인트는 인증이 필요합니다.
인증되지 않은 요청은 401 Unauthorized로 거부됩니다.
GET /projects/:id/repository/changed_paths
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
id |
integer or string | 예 | 프로젝트의 ID 또는 URL 인코딩된 경로. |
from |
string | 예 | 비교 기준이 되는 커밋 SHA, 브랜치 또는 태그. |
to |
string | 예 | 비교 대상이 되는 커밋 SHA, 브랜치 또는 태그. |
find_renames |
boolean | 아니요 | true이면 파일 이름 변경을 탐지합니다. 기본값은 false입니다. |
성공하면 200 OK와 다음 응답 속성을 담은
변경된 경로 목록을 반환합니다:
| 속성 | 유형 | 설명 |
|---|---|---|
new_mode |
string | 새 파일 모드. |
old_mode |
string | 이전 파일 모드. |
old_path |
string | 파일의 이전 경로. 추가된 파일의 경우 빈 문자열입니다. |
path |
string | 파일의 경로. |
status |
string | 변경 유형. ADDED, MODIFIED, DELETED, RENAMED, TYPE_CHANGED, COPIED 중 하나입니다. |
다음 상태 코드를 반환할 수 있습니다:
400 Bad Request:from또는to가 없거나 최대 길이를 초과했습니다.401 Unauthorized: 요청이 인증되지 않았습니다.403 Forbidden: 이 프로젝트에서 리포지터리 내용을 비교할 권한이 없거나 리포지터리가 비활성화되어 있습니다.404 Not Found: 프로젝트가 존재하지 않거나 사용자에게 보이지 않거나, 지정한 ref가 존재하지 않거나,repository_changed_paths_api기능 플래그가 비활성화되어 있습니다.429 Too Many Requests: 이 엔드포인트의 속도 제한을 초과했습니다.
요청 예시:
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/5/repository/changed_paths?from=main&to=feature"
응답 예시:
[
{
"status": "MODIFIED",
"path": "app/models/user.rb",
"old_path": "app/models/user.rb",
"old_mode": "100644",
"new_mode": "100644"
}
]
체인지로그 데이터 생성#
히스토리
- GitLab 17.7에서 CI/CD job 토큰을 통한 인증이 도입되었습니다.
config_file_ref속성이 GitLab 18.2에서 도입되었습니다.- 일반 텍스트 형식(
.txt)이 GitLab 19.1에서 도입되었습니다.
리포지터리의 커밋을 기반으로 체인지로그 데이터를 생성하며, 체인지로그 파일에는 커밋하지 않습니다.
POST /projects/:id/repository/changelog와 정확히 동일하게 동작하지만, 체인지로그
데이터가 체인지로그 파일에 커밋되지 않습니다.
GET /projects/:id/repository/changelog
선택 사항입니다. .txt 접미사를 추가하면 체인지로그를 JSON 대신 일반 텍스트 Markdown으로
반환합니다:
GET /projects/:id/repository/changelog.txt
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
version |
string | 예 | 체인지로그를 생성할 버전. 형식은 시맨틱 버저닝을 따라야 합니다. |
config_file |
string | 아니요 | 프로젝트의 Git 리포지터리에 있는 체인지로그 구성 파일 경로. 기본값은 .gitlab/changelog_config.yml입니다. |
config_file_ref |
string | 아니요 | 체인지로그 구성 파일이 정의된 Git 참조(예: 브랜치). 기본값은 리포지터리의 기본 브랜치입니다. |
date |
datetime | 아니요 | 릴리스의 날짜와 시간. ISO 8601 형식을 사용합니다. 예: 2016-03-11T03:45:40Z. 기본값은 현재 시각입니다. |
from |
string | 아니요 | 체인지로그 생성에 사용할 커밋 범위의 시작(SHA). 이 커밋 자체는 목록에 포함되지 않습니다. |
to |
string | 아니요 | 체인지로그에 사용할 커밋 범위의 끝(SHA). 이 커밋은 목록에 포함됩니다. 기본값은 기본 프로젝트 브랜치의 HEAD입니다. |
trailer |
string | 아니요 | 커밋을 포함할 때 사용할 Git 트레일러. 기본값은 Changelog입니다. |
성공하면 200 OK와 다음
응답 속성을 반환합니다:
| 속성 | 유형 | 설명 |
|---|---|---|
notes |
string | Markdown 형식으로 생성된 체인지로그 데이터. |
요청 예시:
curl --header "PRIVATE-TOKEN: token" \
--url "https://gitlab.com/api/v4/projects/42/repository/changelog?version=1.0.0"
가독성을 위해 줄바꿈을 추가한 응답 예시:
{
"notes": "## 1.0.0 (2021-11-17)\n\n### feature (2 changes)\n\n-
[Title 2](namespace13/project13@ad608eb642124f5b3944ac0ac772fecaf570a6bf)
([merge request](namespace13/project13!2))\n-
[Title 1](namespace13/project13@3c6b80ff7034fa0d585314e1571cc780596ce3c8)
([merge request](namespace13/project13!1))\n"
}
.txt 형식을 사용한 요청 예시:
curl --header "PRIVATE-TOKEN: token" \
--url "https://gitlab.com/api/v4/projects/42/repository/changelog.txt?version=1.0.0"
응답 예시:
## 1.0.0 (2021-11-17)
### feature (2 changes)
- [Title 2](namespace13/project13@ad608eb642124f5b3944ac0ac772fecaf570a6bf)
([merge request](namespace13/project13!2))
- [Title 1](namespace13/project13@3c6b80ff7034fa0d585314e1571cc780596ce3c8)
([merge request](namespace13/project13!1))
파일에 체인지로그 데이터 추가#
히스토리
리포지터리의 커밋을 기반으로 체인지로그 데이터를 생성하고 체인지로그 파일에 커밋합니다.
시맨틱 버전과 커밋 범위가 주어지면 GitLab은 특정 Git 트레일러를 사용하는 모든 커밋에 대한 체인지로그를 생성합니다. GitLab은 프로젝트의 Git 리포지터리에 있는 체인지로그 파일에 새로운 Markdown 형식의 섹션을 추가합니다. 출력 형식은 사용자 지정할 수 있습니다.
성능과 보안상의 이유로 체인지로그 구성 파싱은 2초로 제한됩니다.
이 제한은 잘못된 형식의 체인지로그 템플릿으로 인한 DoS 공격 가능성을 방지하는 데 도움이 됩니다.
요청이 시간 초과되면 changelog_config.yml 파일의 크기를 줄이는 방안을 검토합니다.
사용자용 문서는 체인지로그를 참고합니다.
POST /projects/:id/repository/changelog
체인지로그는 다음 속성을 지원합니다:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
version1 |
string | 예 | 체인지로그를 생성할 버전. 형식은 시맨틱 버저닝을 따라야 합니다. |
branch |
string | 아니요 | 체인지로그 변경 사항을 커밋할 브랜치. 기본값은 프로젝트의 기본 브랜치입니다. |
config_file |
string | 아니요 | 프로젝트의 Git 리포지터리에 있는 체인지로그 구성 파일 경로. 기본값은 .gitlab/changelog_config.yml입니다. |
config_file_ref |
string | 아니요 | 체인지로그 구성 파일이 정의된 Git 참조(예: 브랜치). 기본값은 리포지터리의 기본 브랜치입니다. |
date |
datetime | 아니요 | 릴리스의 날짜와 시간. 기본값은 현재 시각입니다. |
file |
string | 아니요 | 변경 사항을 커밋할 파일. 기본값은 CHANGELOG.md입니다. |
from2 |
string | 아니요 | 체인지로그에 포함할 커밋 범위의 시작을 나타내는 커밋의 SHA. 이 커밋은 체인지로그에 포함되지 않습니다. |
message |
string | 아니요 | 변경 사항을 커밋할 때 사용할 커밋 메시지. 기본값은 Add changelog for version X이며, X는 version 인수의 값입니다. |
to |
string | 아니요 | 체인지로그에 포함할 커밋 범위의 끝을 나타내는 커밋의 SHA. 이 커밋은 체인지로그에 포함됩니다. 기본값은 branch 속성에 지정된 브랜치입니다. 최대 15000개 커밋으로 제한됩니다. |
trailer |
string | 아니요 | 커밋을 포함할 때 사용할 Git 트레일러. 기본값은 Changelog입니다. 대소문자를 구분하므로 Example은 example이나 eXaMpLE과 일치하지 않습니다. |
예시#
이 예시는 cURL을 사용하여 HTTP 요청을 수행합니다. 예시 명령에서는 다음 값을 사용합니다.
- 프로젝트 ID: 42
- 위치: GitLab.com에 호스팅됨
- 예시 API 토큰:
token
이 명령은 버전 1.0.0의 체인지로그를 생성합니다.
커밋 범위는 다음과 같습니다.
- 마지막 릴리스의 태그에서 시작합니다.
- 대상 브랜치의 마지막 커밋에서 끝납니다. 기본 대상 브랜치는 프로젝트의 기본 브랜치입니다.
마지막 태그가 v0.9.0 이고 기본 브랜치가 main 이면, 이 예시에 포함되는 커밋 범위는
v0.9.0..main 입니다.
curl --request POST \
--header "PRIVATE-TOKEN: token" \
--data "version=1.0.0" \
--url "https://gitlab.com/api/v4/projects/42/repository/changelog"
다른 브랜치에서 데이터를 생성하려면 branch 파라미터를 지정합니다. 이
명령은 foo 브랜치에서 데이터를 생성합니다.
curl --request POST \
--header "PRIVATE-TOKEN: token" \
--data "version=1.0.0&branch=foo" \
--url "https://gitlab.com/api/v4/projects/42/repository/changelog"
다른 트레일러를 사용하려면 trailer 파라미터를 사용합니다.
curl --request POST --header "PRIVATE-TOKEN: token" \
--data "version=1.0.0&trailer=Type" \
--url "https://gitlab.com/api/v4/projects/42/repository/changelog"
결과를 다른 파일에 저장하려면 file 파라미터를 사용합니다.
curl --request POST \
--header "PRIVATE-TOKEN: token" \
--data "version=1.0.0&file=NEWS" \
--url "https://gitlab.com/api/v4/projects/42/repository/changelog"
브랜치를 파라미터로 지정하려면 to 속성을 사용합니다.
curl --request GET \
--header "PRIVATE-TOKEN: token" \
--url "https://gitlab.com/api/v4/projects/42/repository/changelog?version=1.0.0&to=release/x.x.x"
수동 체인지로그 파일에서 마이그레이션#
기존의 수동 관리 체인지로그 파일에서 Git 트레일러를 사용하는 방식으로 마이그레이션할 때는,
체인지로그 파일이 예상 형식과 일치하는지 확인합니다.
그렇지 않으면 API가 추가하는 새 체인지로그 항목이 예상과 다른 위치에 삽입될 수 있습니다.
예를 들어 수동 관리 체인지로그 파일의 버전 값이 X.Y.Z가 아니라 vX.Y.Z로
지정되어 있으면, Git 트레일러로 추가된 새 체인지로그 항목은 체인지로그 파일의
끝에 덧붙습니다.
이슈 444183은 체인지로그 파일의
버전 헤더 형식을 사용자 지정하는 방안을 제안합니다.
다만 해당 이슈가 완료되기 전까지 체인지로그 파일에서 예상되는 버전 헤더 형식은 X.Y.Z 입니다.
헬스#
프로젝트 리포지터리의 헬스와 관련된 통계를 가져옵니다.
generate가 true 이면 이 엔드포인트는 프로젝트당 시간당 5회 요청으로 속도가 제한됩니다. 이 엔드포인트는
리포지터리에 푸시 액세스 권한이 있는 사용자만 사용할 수 있습니다.
GET /projects/:id/repository/health
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
generate |
boolean | 아니요 | true 이면 새 헬스 리포트를 생성합니다. 엔드포인트가 404를 반환하면 이 값을 설정합니다. |
성공하면 200 OK와 리포지터리 헬스 통계를 반환합니다.
요청 예시:
curl --header "PRIVATE-TOKEN: token" \
--url "https://gitlab.com/api/v4/projects/42/repository/health"
응답 예시:
{
"size": 2619748827,
"references": {
"loose_count": 13,
"packed_size": 333978,
"reference_backend": "REFERENCE_BACKEND_FILES"
},
"objects": {
"size": 2180475409,
"recent_size": 2180453999,
"stale_size": 21410,
"keep_size": 0,
"packfile_count": 1,
"reverse_index_count": 1,
"cruft_count": 0,
"keep_count": 0,
"loose_objects_count": 36,
"stale_loose_objects_count": 36,
"loose_objects_garbage_count": 0
},
"commit_graph": {
"commit_graph_chain_length": 1,
"has_bloom_filters": true,
"has_generation_data": true,
"has_generation_data_overflow": false
},
"bitmap": null,
"multi_pack_index": {
"packfile_count": 1,
"version": 1
},
"multi_pack_index_bitmap": {
"has_hash_cache": true,
"has_lookup_table": true,
"version": 1
},
"alternates": null,
"is_object_pool": false,
"last_full_repack": {
"seconds": 1745892013,
"nanos": 0
},
"updated_at": "2025-05-14T02:31:08.022Z"
}
응답의 각 필드에 대한 설명은
RepositoryInfoResponse
protobuf 메시지를 참고합니다.
관련 주제#
- 체인지로그에 대한 사용자 문서
Footnotes
-
version속성에는v접두사를 포함할 수도, 생략할 수도 있습니다.1.0.0과v1.0.0은 동일한 결과를 만듭니다. GitLab 17.0에서 도입되었습니다. ↩ -
from을 지정하지 않으면 GitLab은 지정한 버전 바로 앞의 마지막 안정 버전 태그를 자동으로 찾습니다. GitLab은 시맨틱 버저닝에 따라X.Y.Z또는vX.Y.Z형식의 태그를 인식합니다.예를 들어
version이2.1.0이면 GitLab은 태그v2.0.0을 사용합니다.version이1.1.1또는1.2.0이면 GitLab은 태그v1.1.0을 사용합니다.v1.0.0-pre1과 같은 사전 릴리스 태그는 무시됩니다.적합한 태그를 찾지 못하면 API는 오류를 반환하며,
from속성을 명시적으로 지정해야 합니다. ↩