- 列出合并请求
- 列出项目合并请求
- 列出群组合并请求
- 获取单个合并请求
- 获取合并请求参与人
- 获取合并请求提交
- 获取合并请求改动
- 获取合并请求流水线
- 创建合并请求流水线
- 创建合并请求
- 更新合并请求
- 删除合并请求
- 合并合并请求
- 合并至默认 ref 路径
- 取消流水线通过自动合并
- 合并请求变基
- 合并请求评论
- 列出合并时关闭的议题
- 订阅合并请求
- 取消订阅合并请求
- 创建待办事项
- 获取合并请求差异版本
- 获取单个合并请求差异版本
- 为合并提交设置预计用时
- 为合并请求重置预计用时
- 为合并请求添加已用时间
- 为合并请求重置已用时间
- 核准
- 列出合并请求状态事件
合并请求 API
reference
已在 12.10 版本中被弃用并被references
替代。reviewer_username
和reviewer_id
引入于 13.8 版本。draft
引入于14.0 版本以取代work_in_progress
。merge_user
引入于 14.7 版本以取代merged_by
。
所有合并请求 API 的调用行为都需要经过用户鉴权。
列出合并请求
获取经过身份验证的用户有权限访问的所有合并请求。
默认情况下只返回当前用户创建的合并请求。
如果需要获取所有合并请求,请使用参数 scope=all
。
state
参数可用于获取带有给定状态
(opened
、close
、locked
或 merged
)的合并请求,您也可以不针对状态进行筛选(all
)。
需要注意的是,通过 locked
进行筛选通常不会得到任何返回结果,这是因为它是一个临时的过渡状态。
page
和 per_page
分页参数可用于对合并请求进行约束。
GET /merge_requests
GET /merge_requests?state=opened
GET /merge_requests?state=all
GET /merge_requests?milestone=release
GET /merge_requests?labels=bug,reproduced
GET /merge_requests?author_id=5
GET /merge_requests?author_username=gitlab-bot
GET /merge_requests?my_reaction_emoji=star
GET /merge_requests?scope=assigned_to_me
GET /merge_requests?search=foo&in=title
参数:
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
state
| string | no | 返回所有合并请求或返回处于 opened 、closed 、locked 或者 merged 状态的合并请求。
|
order_by
| string | no | 返回根据 created_at 、title 或者 updated_at 排序的合并请求。默认值是 created_at 。引入于 14.8 版本。
|
sort
| string | no | 返回根据 asc 或者 desc 排序的合并请求。默认值是 desc 。
|
milestone
| string | no | 返回与给定里程碑相关联的合并请求。使用 None 则返回没有与任何里程碑关联的合并请求。使用 Any 则返回和至少一个里程碑关联的合并请求。
|
view
| string | no | 若为 simple 则返回合并请求的 iid 、URL、标题、描述和基本状态。
|
labels
| string | no | 返回同时包含所有给定标签(用半角逗号分隔)的合并请求。使用 None 则返回所有没有标签的合并请求。使用 Any 则返回包含至少一个标签的合并请求。预定义名称不区分大小写。
|
with_labels_details
| boolean | no | 若为 true 则返回更详尽的标签信息::name 、:color 、:description 、:description_html 、:text_color 。默认值是 false 。引入于 12.7 版本。
|
with_merge_status_recheck
| boolean | no | 若为 true 请求时会尽可能(但不保证)异步重新计算 merge_status 的值。默认为 false 。引入于 13.0 版本。
|
created_after
| datetime | no | 对于给定的时间戳,返回不早于该时间创建的合并请求。时间戳应符合 ISO 8601 格式(2019-03-15T08:00:00Z )
|
created_before
| datetime | no | 对于给定的时间戳,返回不晚于该时间创建的合并请求。时间戳应符合 ISO 8601 格式(2019-03-15T08:00:00Z )
|
updated_after
| datetime | no | 对于给定的时间戳,返回不早于该时间更新的合并请求。时间戳应符合 ISO 8601 格式(2019-03-15T08:00:00Z )
|
updated_before
| datetime | no | 对于给定的时间戳,返回不晚于该时间创建的合并请求。时间戳应符合 ISO 8601 格式(2019-03-15T08:00:00Z )
|
scope
| string | no | 返回满足范围 created_by_me 、assigned_to_me 或 all 的议题。默认值是 created_by_me 。
|
author_id
| integer | no | 对于给定的用户 id ,返回这名用户创建的合并请求。与 author_username 冲突。和 scope=all 或者 scope=assigned_to_me 配合使用。
|
author_username
| string | no | 对于给定的用户 username ,返回这名用户创建的合并请求。与 author_id 冲突。引入于 12.10 版本。
|
assignee_id
| integer | no | 对于给定的用户 id ,返回分配给这名用户的合并请求。使用 None 则返回无指派人的合并请求。使用 Any 则返回存在指派人的合并请求。
|
approver_ids
| integer array | no | 返回指定核准人包含所有给定用户 id 的合并请求。使用 None 则返回没有指定核准人的合并请求。使用 Any 则返回存在指定核准人的合并请求。
|
approved_by_ids
| integer array | no | 返回实际核准人包含所有给定用户 id (不能超过五人)的合并请求。None 则返回没有实际核准人的合并请求。使用 Any 则返回存在实际核准人的合并请求。
|
reviewer_id
| integer | no | 返回 审核人 包含所有给定用户 id 的合并请求。使用 Any 则返回存在审核人的合并请求。与 reviewer_username 冲突。
|
reviewer_username
| string | no | 返回 审核人 包含所有给定用户 username 的合并请求。使用 None 则返回没有审核人的合并请求。使用 Any 则返回存在审核人的合并请求。与 reviewer_id 冲突。引入于 13.8 版本。
|
my_reaction_emoji
| string | no | 对于给定的 emoji ,返回用户使用该表情回应的合并请求。使用 None 则返回没有使用表情回应的合并请求。使用 Any 则返回使用至少一个表情回应的合并请求。
|
source_branch
| string | no | 返回包含给定源分支的合并请求。 |
target_branch
| string | no | 返回包含给定目标分支的合并请求。 |
search
| string | no | 根据 title 和 description 搜索合并请求。
|
in
| string | no | 修改 search 属性的范围。可以使用 title 、description 或使用半角逗号对他们进行连接。默认值是 title,description 。
|
wip
| string | no | 根据 wip 状态筛选合并请求。使用 yes 则仅返回草稿状态的合并请求,使用 no 则仅返回非草稿状态的合并请求。
|
not
| Hash | no | 对于给定的参数,返回不符合此参数约束的议题。可接受的值:labels 、milestone 、author_id 、author_username 、assignee_id 、assignee_username 、reviewer_id 、reviewer_username 、my_reaction_emoji 。
|
environment
| string | no | 返回部署到给定环境的合并请求。 |
deployed_before
| datetime | no | 对于给定的时间戳,返回不晚于该时间部署的合并请求。时间戳应符合 ISO 8601 格式(2019-03-15T08:00:00Z )
|
deployed_after
| datetime | no | 对于给定的时间戳,返回不早于该时间部署的合并请求。时间戳应符合 ISO 8601 格式(2019-03-15T08:00:00Z )
|
[
{
"id": 1,
"iid": 1,
"project_id": 3,
"title": "test1",
"description": "fixed login page css paddings",
"state": "merged",
"merged_by": { // Deprecated and will be removed in API v5, use `merge_user` instead
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merge_user": {
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merged_at": "2018-09-07T11:16:17.520Z",
"closed_by": null,
"closed_at": null,
"created_at": "2017-04-29T08:46:00Z",
"updated_at": "2017-04-29T08:46:00Z",
"target_branch": "master",
"source_branch": "test1",
"upvotes": 0,
"downvotes": 0,
"author": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"assignee": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"assignees": [{
"name": "Miss Monserrate Beier",
"username": "axel.block",
"id": 12,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
"web_url": "https://gitlab.example.com/axel.block"
}],
"reviewers": [{
"id": 2,
"name": "Sam Bauch",
"username": "kenyatta_oconnell",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/956c92487c6f6f7616b536927e22c9a0?s=80&d=identicon",
"web_url": "http://gitlab.example.com//kenyatta_oconnell"
}],
"source_project_id": 2,
"target_project_id": 3,
"labels": [
"Community contribution",
"Manage"
],
"draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
"iid": 1,
"project_id": 3,
"title": "v2.0",
"description": "Assumenda aut placeat expedita exercitationem labore sunt enim earum.",
"state": "closed",
"created_at": "2015-02-02T19:49:26.013Z",
"updated_at": "2015-02-02T19:49:26.013Z",
"due_date": "2018-09-22",
"start_date": "2018-08-08",
"web_url": "https://gitlab.example.com/my-group/my-project/milestones/1"
},
"merge_when_pipeline_succeeds": true,
"merge_status": "can_be_merged",
"sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1,
"discussion_locked": null,
"should_remove_source_branch": true,
"force_remove_source_branch": false,
"allow_collaboration": false,
"allow_maintainer_to_push": false,
"web_url": "http://gitlab.example.com/my-group/my-project/merge_requests/1",
"references": {
"short": "!1",
"relative": "my-group/my-project!1",
"full": "my-group/my-project!1"
},
"time_stats": {
"time_estimate": 0,
"total_time_spent": 0,
"human_time_estimate": null,
"human_total_time_spent": null
},
"squash": false,
"task_completion_status":{
"count":0,
"completed_count":0
}
}
]
专业版或更高级别的用户还可以看到 approvals_before_merge
参数:
[
{
"id": 1,
"title": "test1",
"approvals_before_merge": null
...
}
]
合并请求列出响应说明
- 引入于 13.0 版本,列出合并请求时不会对
merge_status
(此属性对has_conflicts
也有影响)进行主动更新,因为这可能是一项昂贵的操作。 如果您需要这些字段的值,请在请求中将with_merge_status_recheck
参数设置为true
。 - 有关合并请求对象字段的说明,请阅读单个合并请求响应说明。
列出项目合并请求
获取给定项目下的所有合并请求。
state
参数可用于获取带有给定状态
(opened
、close
、locked
或 merged
)的合并请求,您也可以不针对状态进行筛选(all
)。
page
和 per_page
分页参数可用于对合并请求进行约束。
GET /projects/:id/merge_requests
GET /projects/:id/merge_requests?state=opened
GET /projects/:id/merge_requests?state=all
GET /projects/:id/merge_requests?iids[]=42&iids[]=43
GET /projects/:id/merge_requests?milestone=release
GET /projects/:id/merge_requests?labels=bug,reproduced
GET /projects/:id/merge_requests?my_reaction_emoji=star
project_id
表示合并请求所在项目的 ID。
project_id
总是和 target_project_id
相等。
如果是来自同一项目的合并请求,
source_project_id
、target_project_id
和 project_id
是相同的。对于来源派生项目的合并请求,
target_project_id
和 project_id
是一样的
source_project_id
是派生项目的 ID。
参数:
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
iids[]
| integer array | no | 返回包含给定 iid 的合并请求。
|
state
| string | no | 返回所有合并请求或返回处于 opened 、closed 、locked 或者 merged 状态的合并请求。
|
order_by
| string | no | 返回根据 created_at 、title 或者 updated_at 排序的合并请求。默认值是 created_at 。引入于 14.8 版本。
|
sort
| string | no | 返回根据 asc 或者 desc 排序的合并请求。默认值是 desc 。
|
milestone
| string | no | 返回与给定里程碑相关联的合并请求。使用 None 则返回没有与任何里程碑关联的合并请求。使用 Any 则返回和至少一个里程碑关联的合并请求。
|
view
| string | no | 若为 simple 则返回合并请求的 iid 、URL、标题、描述和基本状态。
|
labels
| string | no | 返回同时包含所有给定标签(用半角逗号分隔)的合并请求。使用 None 则返回所有没有标签的合并请求。使用 Any 则返回包含至少一个标签的合并请求。预定义名称不区分大小写。
|
with_labels_details
| boolean | no | 若为 true 则返回更详尽的标签信息::name 、:color 、:description 、:description_html 、:text_color 。默认值是 false 。引入于 12.7 版本。
|
with_merge_status_recheck
| boolean | no | 若为 true 请求时会尽可能(但不保证)异步重新计算 merge_status 的值。默认为 false 。引入于 13.0 版本。
|
created_after
| datetime | no | 对于给定的时间戳,返回不早于该时间创建的合并请求。时间戳应符合 ISO 8601 格式(2019-03-15T08:00:00Z )
|
created_before
| datetime | no | 对于给定的时间戳,返回不晚于该时间创建的合并请求。时间戳应符合 ISO 8601 格式(2019-03-15T08:00:00Z )
|
updated_after
| datetime | no | 对于给定的时间戳,返回不早于该时间更新的合并请求。时间戳应符合 ISO 8601 格式(2019-03-15T08:00:00Z )
|
updated_before
| datetime | no | 对于给定的时间戳,返回不晚于该时间创建的合并请求。时间戳应符合 ISO 8601 格式(2019-03-15T08:00:00Z )
|
scope
| string | no | 返回满足范围 created_by_me 、assigned_to_me 或 all 的议题。
|
author_id
| integer | no | 对于给定的用户 id ,返回这名用户创建的合并请求。与 author_username 冲突。
|
author_username
| string | no | 对于给定的用户 username ,返回这名用户创建的合并请求。与 author_id 冲突。引入于 12.10 版本。
|
assignee_id
| integer | no | 对于给定的用户 id ,返回分配给这名用户的合并请求。使用 None 则返回无指派人的合并请求。使用 Any 则返回存在指派人的合并请求。
|
approver_ids
| integer array | no | 返回指定核准人包含所有给定用户 id 的合并请求。使用 None 则返回没有指定核准人的合并请求。使用 Any 则返回存在指定核准人的合并请求。
|
approved_by_ids
| integer array | no | 返回实际核准人包含所有给定用户 id (不能超过五人)的合并请求。None 则返回没有实际核准人的合并请求。使用 Any 则返回存在实际核准人的合并请求。
|
reviewer_id
| integer | no | 返回审核人 包含所有给定用户 id 的合并请求。使用 Any 则返回存在审核人的合并请求。与 reviewer_username 冲突。
|
reviewer_username
| string | no | 返回审核人 包含所有给定用户 username 的合并请求。使用 None 则返回没有审核人的合并请求。使用 Any 则返回存在审核人的合并请求。与 reviewer_id 冲突。引入于 13.8 版本。
|
my_reaction_emoji
| string | no | 对于给定的 emoji ,返回用户使用该表情回应的合并请求。使用 None 则返回没有使用表情回应的合并请求。使用 Any 则返回使用至少一个表情回应的合并请求。
|
source_branch
| string | no | 返回包含给定源分支的合并请求。 |
target_branch
| string | no | 返回包含给定目标分支的合并请求。 |
search
| string | no | 根据 title 和 description 搜索合并请求。
|
wip
| string | no | 根据 wip 状态筛选合并请求。使用 yes 则仅返回草稿状态的合并请求,使用 no 则仅返回非草稿状态的合并请求。
|
not
| Hash | no | 对于给定的参数,返回不符合此参数约束的议题。可接受的值:labels 、milestone 、author_id 、author_username 、assignee_id 、assignee_username 、reviewer_id 、reviewer_username 、my_reaction_emoji 。
|
environment
| string | no | 返回部署到给定环境的合并请求。 |
[
{
"id": 1,
"iid": 1,
"project_id": 3,
"title": "test1",
"description": "fixed login page css paddings",
"state": "merged",
"merged_by": { // Deprecated and will be removed in API v5, use `merge_user` instead
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merge_user": {
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merged_at": "2018-09-07T11:16:17.520Z",
"closed_by": null,
"closed_at": null,
"created_at": "2017-04-29T08:46:00Z",
"updated_at": "2017-04-29T08:46:00Z",
"target_branch": "master",
"source_branch": "test1",
"upvotes": 0,
"downvotes": 0,
"author": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"assignee": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"assignees": [{
"name": "Miss Monserrate Beier",
"username": "axel.block",
"id": 12,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
"web_url": "https://gitlab.example.com/axel.block"
}],
"reviewers": [{
"id": 2,
"name": "Sam Bauch",
"username": "kenyatta_oconnell",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/956c92487c6f6f7616b536927e22c9a0?s=80&d=identicon",
"web_url": "http://gitlab.example.com//kenyatta_oconnell"
}],
"source_project_id": 2,
"target_project_id": 3,
"labels": [
"Community contribution",
"Manage"
],
"draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
"iid": 1,
"project_id": 3,
"title": "v2.0",
"description": "Assumenda aut placeat expedita exercitationem labore sunt enim earum.",
"state": "closed",
"created_at": "2015-02-02T19:49:26.013Z",
"updated_at": "2015-02-02T19:49:26.013Z",
"due_date": "2018-09-22",
"start_date": "2018-08-08",
"web_url": "https://gitlab.example.com/my-group/my-project/milestones/1"
},
"merge_when_pipeline_succeeds": true,
"merge_status": "can_be_merged",
"sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1,
"discussion_locked": null,
"should_remove_source_branch": true,
"force_remove_source_branch": false,
"allow_collaboration": false,
"allow_maintainer_to_push": false,
"web_url": "http://gitlab.example.com/my-group/my-project/merge_requests/1",
"references": {
"short": "!1",
"relative": "!1",
"full": "my-group/my-project!1"
},
"time_stats": {
"time_estimate": 0,
"total_time_spent": 0,
"human_time_estimate": null,
"human_total_time_spent": null
},
"squash": false,
"task_completion_status":{
"count":0,
"completed_count":0
},
"has_conflicts": false,
"blocking_discussions_resolved": true
}
]
专业版或更高级别的用户还可以看到 approvals_before_merge
参数:
json
[
{
"id": 1,
"title": "test1",
"approvals_before_merge": null
...
}
]
关于响应数据,请留意合并请求列出响应说明一节。
列出群组合并请求
获取给定群组及其子群组下的所有合并请求。
state
参数可用于获取带有给定状态
(opened
、close
、locked
或 merged
)的合并请求,你也可以不针对状态进行筛选(all
)。
page
和 per_page
分页参数可用于对合并请求进行约束。
GET /groups/:id/merge_requests
GET /groups/:id/merge_requests?state=opened
GET /groups/:id/merge_requests?state=all
GET /groups/:id/merge_requests?milestone=release
GET /groups/:id/merge_requests?labels=bug,reproduced
GET /groups/:id/merge_requests?my_reaction_emoji=star
group_id
表示合并请求对应项目所在群组的 ID。
参数:
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的群组 ID 或经过 URL 编码处理的路径。 |
state
| string | no | 返回所有合并请求或返回处于 opened 、closed 、locked 或者 merged 状态的合并请求。
|
order_by
| string | no | 返回根据 created_at 、title 或者 updated_at 排序的合并请求。默认值是 created_at 。引入于 14.8 版本。
|
sort
| string | no | 返回根据 asc 或者 desc 排序的合并请求。默认值是 desc 。
|
milestone
| string | no | 返回与给定里程碑相关联的合并请求。使用 None 则返回没有与任何里程碑关联的合并请求。使用 Any 则返回和至少一个里程碑关联的合并请求。
|
view
| string | no | 若为 simple 则返回合并请求的 iid 、URL、标题、描述和基本状态。
|
labels
| string | no | 返回同时包含所有给定标签(用半角逗号分隔)的合并请求。使用 None 则返回所有没有标签的合并请求。使用 Any 则返回包含至少一个标签的合并请求。预定义名称不区分大小写。
|
with_labels_details
| boolean | no | 若为 true 则返回更详尽的标签信息::name 、:color 、:description 、:description_html 、:text_color 。默认值是 false 。引入于 12.7 版本。
|
with_merge_status_recheck
| boolean | no | 若为 true 请求时会尽可能(但不保证)异步重新计算 merge_status 的值。默认为 false 。引入于 13.0 版本。
|
created_after
| datetime | no | 对于给定的时间戳,返回不早于该时间创建的合并请求。时间戳应符合 ISO 8601 格式(2019-03-15T08:00:00Z )
|
created_before
| datetime | no | 对于给定的时间戳,返回不晚于该时间创建的合并请求。时间戳应符合 ISO 8601 格式(2019-03-15T08:00:00Z )
|
updated_after
| datetime | no | 对于给定的时间戳,返回不早于该时间更新的合并请求。时间戳应符合 ISO 8601 格式(2019-03-15T08:00:00Z )
|
updated_before
| datetime | no | 对于给定的时间戳,返回不晚于该时间创建的合并请求。时间戳应符合 ISO 8601 格式(2019-03-15T08:00:00Z )
|
scope
| string | no | 返回满足范围 created_by_me 、assigned_to_me 或 all 的议题。
|
author_id
| integer | no | 对于给定的用户 id ,返回这名用户创建的合并请求。与 author_username 冲突。
|
author_username
| string | no | 对于给定的用户 username ,返回这名用户创建的合并请求。与 author_id 冲突。引入于 12.10 版本。
|
assignee_id
| integer | no | 对于给定的用户 id ,返回分配给这名用户的合并请求。使用 None 则返回无指派人的合并请求。使用 Any 则返回存在指派人的合并请求。
|
approver_ids
| integer array | no | 返回指定核准人包含所有给定用户 id 的合并请求。使用 None 则返回没有指定核准人的合并请求。使用 Any 则返回存在指定核准人的合并请求。
|
approved_by_ids
| integer array | no | 返回实际核准人包含所有给定用户 id (不能超过五人)的合并请求。None 则返回没有实际核准人的合并请求。使用 Any 则返回存在实际核准人的合并请求。
|
reviewer_id
| integer | no | 返回审核人 包含所有给定用户 id 的合并请求。使用 Any 则返回存在审核人的合并请求。与 reviewer_username 冲突。
|
reviewer_username
| string | no | 返回审核人 包含所有给定用户 username 的合并请求。使用 None 则返回没有审核人的合并请求。使用 Any 则返回存在审核人的合并请求。与 reviewer_id 冲突。引入于 13.8 版本。
|
my_reaction_emoji
| string | no | 对于给定的 emoji ,返回用户使用该表情回应的合并请求。使用 None 则返回没有使用表情回应的合并请求。使用 Any 则返回使用至少一个表情回应的合并请求。
|
source_branch
| string | no | 返回包含给定源分支的合并请求。 |
target_branch
| string | no | 返回包含给定目标分支的合并请求。 |
search
| string | no | 根据 title 和 description 搜索合并请求。
|
non_archived
| boolean | no | 是否只返回未归档项目的合并请求。默认值是 true 。引入于 12.8 版本。
|
not
| Hash | no | 对于给定的参数,返回不符合此参数约束的议题。可接受的值:labels 、milestone 、author_id 、author_username 、assignee_id 、assignee_username 、reviewer_id 、reviewer_username 、my_reaction_emoji 。
|
[
{
"id": 1,
"iid": 1,
"project_id": 3,
"title": "test1",
"description": "fixed login page css paddings",
"state": "merged",
"merged_by": { // Deprecated and will be removed in API v5, use `merge_user` instead
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merge_user": {
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merged_at": "2018-09-07T11:16:17.520Z",
"closed_by": null,
"closed_at": null,
"created_at": "2017-04-29T08:46:00Z",
"updated_at": "2017-04-29T08:46:00Z",
"target_branch": "master",
"source_branch": "test1",
"upvotes": 0,
"downvotes": 0,
"author": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"assignee": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"assignees": [{
"name": "Miss Monserrate Beier",
"username": "axel.block",
"id": 12,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
"web_url": "https://gitlab.example.com/axel.block"
}],
"reviewers": [{
"id": 2,
"name": "Sam Bauch",
"username": "kenyatta_oconnell",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/956c92487c6f6f7616b536927e22c9a0?s=80&d=identicon",
"web_url": "http://gitlab.example.com//kenyatta_oconnell"
}],
"source_project_id": 2,
"target_project_id": 3,
"labels": [
"Community contribution",
"Manage"
],
"draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
"iid": 1,
"project_id": 3,
"title": "v2.0",
"description": "Assumenda aut placeat expedita exercitationem labore sunt enim earum.",
"state": "closed",
"created_at": "2015-02-02T19:49:26.013Z",
"updated_at": "2015-02-02T19:49:26.013Z",
"due_date": "2018-10-22",
"start_date": "2018-09-08",
"web_url": "gitlab.example.com/my-group/my-project/milestones/1"
},
"merge_when_pipeline_succeeds": true,
"merge_status": "can_be_merged",
"sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1,
"discussion_locked": null,
"should_remove_source_branch": true,
"force_remove_source_branch": false,
"web_url": "http://gitlab.example.com/my-group/my-project/merge_requests/1",
"references": {
"short": "!1",
"relative": "my-project!1",
"full": "my-group/my-project!1"
},
"time_stats": {
"time_estimate": 0,
"total_time_spent": 0,
"human_time_estimate": null,
"human_total_time_spent": null
},
"squash": false,
"task_completion_status":{
"count":0,
"completed_count":0
},
"has_conflicts": false,
"blocking_discussions_resolved": true
}
]
专业版或更高级别 的用户还可以看到 approvals_before_merge
参数:
[
{
"id": 1,
"title": "test1",
"approvals_before_merge": null
...
}
]
关于响应数据,请留意合并请求列出响应说明一节。
获取单个合并请求
显示某一合并请求的具体信息。
注意: 响应中 changes_count
的值是一个字符串,而不是整数。
这是因为有些合并请求的改动过大,我们将改动统计上限设置为了 1,000。
此时改动统计返回值会是 "1000+"
。
GET /projects/:id/merge_requests/:merge_request_iid
参数:
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
render_html
| boolean | no | 若为 true ,则对于标题和描述均响应 HTML 渲染后的内容。
|
include_diverged_commits_count
| boolean | no | 若为 true ,则响应落后于目标分支的提交数量。
|
include_rebase_in_progress
| boolean | no | 若为 true ,则响应变基操作是否正在进行。
|
{
"id": 155016530,
"iid": 133,
"project_id": 15513260,
"title": "Manual job rules",
"description": "",
"state": "opened",
"created_at": "2022-05-13T07:26:38.402Z",
"updated_at": "2022-05-14T03:38:31.354Z",
"merged_by": null, // Deprecated and will be removed in API v5, use `merge_user` instead
"merge_user": null,
"merged_at": null,
"closed_by": null,
"closed_at": null,
"target_branch": "master",
"source_branch": "manual-job-rules",
"user_notes_count": 0,
"upvotes": 0,
"downvotes": 0,
"author": {
"id": 4155490,
"username": "marcel.amirault",
"name": "Marcel Amirault",
"state": "active",
"avatar_url": "https://gitlab.com/uploads/-/system/user/avatar/4155490/avatar.png",
"web_url": "https://gitlab.com/marcel.amirault"
},
"assignees": [],
"assignee": null,
"reviewers": [],
"source_project_id": 15513260,
"target_project_id": 15513260,
"labels": [],
"draft": false,
"work_in_progress": false,
"milestone": null,
"merge_when_pipeline_succeeds": false,
"merge_status": "can_be_merged",
"sha": "e82eb4a098e32c796079ca3915e07487fc4db24c",
"merge_commit_sha": null,
"squash_commit_sha": null,
"discussion_locked": null,
"should_remove_source_branch": null,
"force_remove_source_branch": true,
"reference": "!133",
"references": {
"short": "!133",
"relative": "!133",
"full": "marcel.amirault/test-project!133"
},
"web_url": "https://gitlab.com/marcel.amirault/test-project/-/merge_requests/133",
"time_stats": {
"time_estimate": 0,
"total_time_spent": 0,
"human_time_estimate": null,
"human_total_time_spent": null
},
"squash": false,
"task_completion_status": {
"count": 0,
"completed_count": 0
},
"has_conflicts": false,
"blocking_discussions_resolved": true,
"approvals_before_merge": null,
"subscribed": true,
"changes_count": "1",
"latest_build_started_at": "2022-05-13T09:46:50.032Z",
"latest_build_finished_at": null,
"first_deployed_to_production_at": null,
"pipeline": { // Old parameter, use `head_pipeline` instead.
"id": 538317940,
"iid": 1877,
"project_id": 15513260,
"sha": "1604b0c46c395822e4e9478777f8e54ac99fe5b9",
"ref": "refs/merge-requests/133/merge",
"status": "failed",
"source": "merge_request_event",
"created_at": "2022-05-13T09:46:39.560Z",
"updated_at": "2022-05-13T09:47:20.706Z",
"web_url": "https://gitlab.com/marcel.amirault/test-project/-/pipelines/538317940"
},
"head_pipeline": {
"id": 538317940,
"iid": 1877,
"project_id": 15513260,
"sha": "1604b0c46c395822e4e9478777f8e54ac99fe5b9",
"ref": "refs/merge-requests/133/merge",
"status": "failed",
"source": "merge_request_event",
"created_at": "2022-05-13T09:46:39.560Z",
"updated_at": "2022-05-13T09:47:20.706Z",
"web_url": "https://gitlab.com/marcel.amirault/test-project/-/pipelines/538317940",
"before_sha": "1604b0c46c395822e4e9478777f8e54ac99fe5b9",
"tag": false,
"yaml_errors": null,
"user": {
"id": 4155490,
"username": "marcel.amirault",
"name": "Marcel Amirault",
"state": "active",
"avatar_url": "https://gitlab.com/uploads/-/system/user/avatar/4155490/avatar.png",
"web_url": "https://gitlab.com/marcel.amirault"
},
"started_at": "2022-05-13T09:46:50.032Z",
"finished_at": "2022-05-13T09:47:20.697Z",
"committed_at": null,
"duration": 30,
"queued_duration": 10,
"coverage": null,
"detailed_status": {
"icon": "status_failed",
"text": "failed",
"label": "failed",
"group": "failed",
"tooltip": "failed",
"has_details": true,
"details_path": "/marcel.amirault/test-project/-/pipelines/538317940",
"illustration": null,
"favicon": "/assets/ci_favicons/favicon_status_failed-41304d7f7e3828808b0c26771f0309e55296819a9beea3ea9fbf6689d9857c12.png"
}
},
"diff_refs": {
"base_sha": "1162f719d711319a2efb2a35566f3bfdadee8bab",
"head_sha": "e82eb4a098e32c796079ca3915e07487fc4db24c",
"start_sha": "1162f719d711319a2efb2a35566f3bfdadee8bab"
},
"merge_error": null,
"first_contribution": false,
"user": {
"can_merge": true
}
}
专业版或更高级别的用户还可以看到 approvals_before_merge
参数:
{
"id": 1,
"title": "test1",
"approvals_before_merge": null
...
}
单个合并请求响应说明
-
merge_status
字段可能包含以下值之一:-
unchecked
:此合并请求尚未被检查。 -
checking
:正在检查此合并请求是否可以合并。 -
can_be_merged
:此合并请求可以合并且不会发生合并冲突。 -
cannot_be_merged
:源分支和目标分支之间存在合并冲突。 -
cannot_be_merged_recheck
:尚未被检查。在当前的更改之前,原本存在合并冲突。
-
-
diff_refs
为合并请求的当前变更版本。 - 可合并性(
merge_status
)引入于 12.8 版本。 当发出请求时,后台会异步检查每个合并请求。轮询此 API 节点以获取最新状态。可合并性会影响has_conflicts
属性, 因为他们之间存在依赖关系。除非merge_status
是cannot_be_merged
,否则它都会返回false
。 -
references.relative
属性值和所请求合并请求所在的群组和项目有关。 如果是在某个项目中获取其中的合并请求,relative
的格式与short
的格式相同。 如果是跨越多个群组或项目进行请求,其格式应该与full
格式相同。 -
merge_user
字段引入于 14.7 版本, 可以是合并此合并请求的用户、设置流水线成功即自动合并的用户或者null
。merged_by
字段(可以是合并此合并请求的用户或null
)已经被弃用。
获取合并请求参与人
获取参与到某一合并请求的用户。
GET /projects/:id/merge_requests/:merge_request_iid/participants
参数:
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
[
{
"id": 1,
"name": "John Doe1",
"username": "user1",
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/c922747a93b40d1ea88262bf1aebee62?s=80&d=identicon",
"web_url": "http://localhost/user1"
},
{
"id": 2,
"name": "John Doe2",
"username": "user2",
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/10fc7f102be8de7657fb4d80898bbfe3?s=80&d=identicon",
"web_url": "http://localhost/user2"
}
]
获取合并请求提交
获取某个合并请求的所有提交信息。
GET /projects/:id/merge_requests/:merge_request_iid/commits
参数:
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
[
{
"id": "ed899a2f4b50b4370feeea94676502b42383c746",
"short_id": "ed899a2f4b5",
"title": "Replace sanitize with escape once",
"author_name": "Example User",
"author_email": "user@example.com",
"created_at": "2012-09-20T11:50:22+03:00",
"message": "Replace sanitize with escape once"
},
{
"id": "6104942438c14ec7bd21c6cd5bd995272b3faff6",
"short_id": "6104942438c",
"title": "Sanitize for network graph",
"author_name": "Example User",
"author_email": "user@example.com",
"created_at": "2012-09-20T09:06:12+03:00",
"message": "Sanitize for network graph"
}
]
获取合并请求改动
显示合并请求的相关信息,包括改动的文件和内容。
引入于 13.6 版本,无论是 API 还是网页端界面,
文件改动差异数据都有相同的大小限制。当这一限制影响响应结果时,overflow
的值将为 true
。
可以通过添加 access_raw_diffs
参数来获取不加限制的差异数据,此时将不再从数据库而是直接从 Gitaly 访问差异。
这种方法通常速度较慢且资源密集,但不受数据库的限制。
GET /projects/:id/merge_requests/:merge_request_iid/changes
参数:
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
access_raw_diffs
| boolean | no | 从 Gitaly 获取文件差异。 |
{
"id": 21,
"iid": 1,
"project_id": 4,
"title": "Blanditiis beatae suscipit hic assumenda et molestias nisi asperiores repellat et.",
"state": "reopened",
"created_at": "2015-02-02T19:49:39.159Z",
"updated_at": "2015-02-02T20:08:49.959Z",
"target_branch": "secret_token",
"source_branch": "version-1-9",
"upvotes": 0,
"downvotes": 0,
"author": {
"name": "Chad Hamill",
"username": "jarrett",
"id": 5,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/b95567800f828948baf5f4160ebb2473?s=40&d=identicon",
"web_url" : "https://gitlab.example.com/jarrett"
},
"assignee": {
"name": "Administrator",
"username": "root",
"id": 1,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40&d=identicon",
"web_url" : "https://gitlab.example.com/root"
},
"assignees": [{
"name": "Miss Monserrate Beier",
"username": "axel.block",
"id": 12,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
"web_url": "https://gitlab.example.com/axel.block"
}],
"reviewers": [{
"name": "Miss Monserrate Beier",
"username": "axel.block",
"id": 12,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
"web_url": "https://gitlab.example.com/axel.block"
}],
"source_project_id": 4,
"target_project_id": 4,
"labels": [ ],
"description": "Qui voluptatibus placeat ipsa alias quasi. Deleniti rem ut sint. Optio velit qui distinctio.",
"draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
"iid": 1,
"project_id": 4,
"title": "v2.0",
"description": "Assumenda aut placeat expedita exercitationem labore sunt enim earum.",
"state": "closed",
"created_at": "2015-02-02T19:49:26.013Z",
"updated_at": "2015-02-02T19:49:26.013Z",
"due_date": null
},
"merge_when_pipeline_succeeds": true,
"merge_status": "can_be_merged",
"subscribed" : true,
"sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1,
"changes_count": "1",
"should_remove_source_branch": true,
"force_remove_source_branch": false,
"squash": false,
"web_url": "http://gitlab.example.com/my-group/my-project/merge_requests/1",
"references": {
"short": "!1",
"relative": "!1",
"full": "my-group/my-project!1"
},
"discussion_locked": false,
"time_stats": {
"time_estimate": 0,
"total_time_spent": 0,
"human_time_estimate": null,
"human_total_time_spent": null
},
"task_completion_status":{
"count":0,
"completed_count":0
},
"changes": [
{
"old_path": "VERSION",
"new_path": "VERSION",
"a_mode": "100644",
"b_mode": "100644",
"diff": "--- a/VERSION\ +++ b/VERSION\ @@ -1 +1 @@\ -1.9.7\ +1.9.8",
"new_file": false,
"renamed_file": false,
"deleted_file": false
}
],
"overflow": false
}
获取合并请求流水线
获取单个合并请求的流水线信息。
GET /projects/:id/merge_requests/:merge_request_iid/pipelines
参数:
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
[
{
"id": 77,
"sha": "959e04d7c7a30600c894bd3c0cd0e1ce7f42c11d",
"ref": "master",
"status": "success"
}
]
创建合并请求流水线
引入于 12.3 版本。
创建一个新的用于合并请求的流水线。
通过此节点创建的流水线不会运行常规的分支/标签流水线。
需要将 .gitlab-ci.yml
配置为 only: [merge_requests]
来创建作业。
新的流水线可以是:
POST /projects/:id/merge_requests/:merge_request_iid/pipelines
参数:
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
{
"id": 2,
"sha": "b83d6e391c22777fca1ed3012fce84f633d7fed0",
"ref": "refs/merge-requests/1/head",
"status": "pending",
"web_url": "http://localhost/user1/project1/pipelines/2",
"before_sha": "0000000000000000000000000000000000000000",
"tag": false,
"yaml_errors": null,
"user": {
"id": 1,
"name": "John Doe1",
"username": "user1",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/c922747a93b40d1ea88262bf1aebee62?s=80&d=identicon",
"web_url": "http://example.com"
},
"created_at": "2019-09-04T19:20:18.267Z",
"updated_at": "2019-09-04T19:20:18.459Z",
"started_at": null,
"finished_at": null,
"committed_at": null,
"duration": null,
"coverage": null,
"detailed_status": {
"icon": "status_pending",
"text": "pending",
"label": "pending",
"group": "pending",
"tooltip": "pending",
"has_details": false,
"details_path": "/user1/project1/pipelines/2",
"illustration": null,
"favicon": "/assets/ci_favicons/favicon_status_pending-5bdf338420e5221ca24353b6bff1c9367189588750632e9a871b7af09ff6a2ae.png"
}
}
创建合并请求
创建一个新的合并请求。
POST /projects/:id/merge_requests
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
source_branch
| string | yes | 源分支。 |
target_branch
| string | yes | 目标分支。 |
title
| string | yes | 合并请求的标题。 |
assignee_id
| integer | no | 指派人的用户 ID。 |
assignee_ids
| integer array | no | 指派人的用户 ID。设置为 0 或提供一个空串以取消所有指派。
|
reviewer_ids
| integer array | no | 审核人的用户 ID。设置为 0 或提供一个空串则不添加审核人。引入于 13.8 版本。
|
description
| string | no | 合并请求的描述。不能超过 1,048,576 个字符。 |
target_project_id
| integer | no | 目标项目的 ID。 |
labels
| string | no | 合并请求的标签,以半角逗号间隔。 |
milestone_id
| integer | no | 里程碑的全局 ID。 |
remove_source_branch
| boolean | no | 是否在合并请求被合并时删除源分支。 |
allow_collaboration
| boolean | no | 是否允许具有合并权限的用户提交更改。 |
allow_maintainer_to_push
| boolean | no |
allow_collaboration 的别称。
|
approvals_before_merge
| integer | no | 合并前需要获得的核准数量(详见下文)。 |
squash
| boolean | no | 合并时压缩所有提交。 |
如果不提供 approvals_before_merge
,它将自动继承目标项目中的设定值。如果提供的话,必须满足下面的条件:
- 目标项目的
approvals_before_merge
必须大于 0。如果值为 0 表示该项目没有启用核准机制。 - 提供的
approvals_before_merge
必须大于目标项目的approvals_before_merge
。
{
"id": 1,
"iid": 1,
"project_id": 3,
"title": "test1",
"description": "fixed login page css paddings",
"state": "merged",
"created_at": "2017-04-29T08:46:00Z",
"updated_at": "2017-04-29T08:46:00Z",
"target_branch": "master",
"source_branch": "test1",
"upvotes": 0,
"downvotes": 0,
"author": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"assignee": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"source_project_id": 2,
"target_project_id": 3,
"labels": [
"Community contribution",
"Manage"
],
"draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
"iid": 1,
"project_id": 3,
"title": "v2.0",
"description": "Assumenda aut placeat expedita exercitationem labore sunt enim earum.",
"state": "closed",
"created_at": "2015-02-02T19:49:26.013Z",
"updated_at": "2015-02-02T19:49:26.013Z",
"due_date": "2018-09-22",
"start_date": "2018-08-08",
"web_url": "https://gitlab.example.com/my-group/my-project/milestones/1"
},
"merge_when_pipeline_succeeds": true,
"merge_status": "can_be_merged",
"merge_error": null,
"sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1,
"discussion_locked": null,
"should_remove_source_branch": true,
"force_remove_source_branch": false,
"allow_collaboration": false,
"allow_maintainer_to_push": false,
"web_url": "http://gitlab.example.com/my-group/my-project/merge_requests/1",
"references": {
"short": "!1",
"relative": "!1",
"full": "my-group/my-project!1"
},
"time_stats": {
"time_estimate": 0,
"total_time_spent": 0,
"human_time_estimate": null,
"human_total_time_spent": null
},
"squash": false,
"subscribed": false,
"changes_count": "1",
"merged_by": { // Deprecated and will be removed in API v5, use `merge_user` instead
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merge_user": {
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merged_at": "2018-09-07T11:16:17.520Z",
"closed_by": null,
"closed_at": null,
"latest_build_started_at": "2018-09-07T07:27:38.472Z",
"latest_build_finished_at": "2018-09-07T08:07:06.012Z",
"first_deployed_to_production_at": null,
"pipeline": {
"id": 29626725,
"sha": "2be7ddb704c7b6b83732fdd5b9f09d5a397b5f8f",
"ref": "patch-28",
"status": "success",
"web_url": "https://gitlab.example.com/my-group/my-project/pipelines/29626725"
},
"diff_refs": {
"base_sha": "c380d3acebd181f13629a25d2e2acca46ffe1e00",
"head_sha": "2be7ddb704c7b6b83732fdd5b9f09d5a397b5f8f",
"start_sha": "c380d3acebd181f13629a25d2e2acca46ffe1e00"
},
"diverged_commits_count": 2,
"task_completion_status":{
"count":0,
"completed_count":0
}
}
专业版或更高级别的用户还可以看到 approvals_before_merge
参数:
{
"id": 1,
"title": "test1",
"approvals_before_merge": null
...
}
有关合并请求对象字段的说明,请阅读单个合并请求响应说明。
更新合并请求
更新一个合并请求。您可以修改目标分支、标题,甚至关闭合并请求。
PUT /projects/:id/merge_requests/:merge_request_iid
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的 ID。 |
target_branch
| string | no | 目标分支。 |
title
| string | no | 合并请求的标题。 |
assignee_id
| integer | no | 指派人的用户 ID。设置为 0 或提供一个空串以取消所有指派。
|
assignee_ids
| integer array | no | 指派人的用户 ID。设置为 0 或提供一个空串以取消所有指派。
|
reviewer_ids
| integer array | no | 审核人的用户 ID。设置为 0 或提供一个空串则不添加审核人。引入于 13.8 版本。
|
milestone_id
| integer | no | 里程碑的全局 ID。设置为 0 或提供一个空值以取消里程碑关联。
|
labels
| string | no | 合并请求的标签,以半角逗号间隔。提供一个空串以删除所有标签。 |
add_labels
| string | no | 需要给合并请求添加的标签,使用半角逗号分隔。 |
remove_labels
| string | no | 需要给合并请求删除的标签,使用半角逗号分隔。 |
description
| string | no | 合并请求的描述。不能超过 1,048,576 个字符。 |
state_event
| string | no | 合并请求的新状态,close 或者 reopen 。
|
remove_source_branch
| boolean | no | 是否在合并请求被合并时删除源分支。 |
squash
| boolean | no | 合并时压缩所有提交。 |
discussion_locked
| boolean | no | 标记此合并请求讨论是否被锁定。只有项目成员可以往锁定的合并请求添加、编辑或解决讨论。 |
allow_collaboration
| boolean | no | 是否允许具有合并权限的用户提交更改。 |
allow_maintainer_to_push
| boolean | no |
allow_collaboration 的别称。
|
至少需要包含上述属性中的其中一个。
{
"id": 1,
"iid": 1,
"project_id": 3,
"title": "test1",
"description": "fixed login page css paddings",
"state": "merged",
"created_at": "2017-04-29T08:46:00Z",
"updated_at": "2017-04-29T08:46:00Z",
"target_branch": "master",
"source_branch": "test1",
"upvotes": 0,
"downvotes": 0,
"author": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"assignee": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"assignees": [{
"name": "Miss Monserrate Beier",
"username": "axel.block",
"id": 12,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
"web_url": "https://gitlab.example.com/axel.block"
}],
"reviewers": [{
"name": "Miss Monserrate Beier",
"username": "axel.block",
"id": 12,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
"web_url": "https://gitlab.example.com/axel.block"
}],
"source_project_id": 2,
"target_project_id": 3,
"labels": [
"Community contribution",
"Manage"
],
"draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
"iid": 1,
"project_id": 3,
"title": "v2.0",
"description": "Assumenda aut placeat expedita exercitationem labore sunt enim earum.",
"state": "closed",
"created_at": "2015-02-02T19:49:26.013Z",
"updated_at": "2015-02-02T19:49:26.013Z",
"due_date": "2018-09-22",
"start_date": "2018-08-08",
"web_url": "https://gitlab.example.com/my-group/my-project/milestones/1"
},
"merge_when_pipeline_succeeds": true,
"merge_status": "can_be_merged",
"merge_error": null,
"sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1,
"discussion_locked": null,
"should_remove_source_branch": true,
"force_remove_source_branch": false,
"allow_collaboration": false,
"allow_maintainer_to_push": false,
"web_url": "http://gitlab.example.com/my-group/my-project/merge_requests/1",
"references": {
"short": "!1",
"relative": "!1",
"full": "my-group/my-project!1"
},
"time_stats": {
"time_estimate": 0,
"total_time_spent": 0,
"human_time_estimate": null,
"human_total_time_spent": null
},
"squash": false,
"subscribed": false,
"changes_count": "1",
"merged_by": { // Deprecated and will be removed in API v5, use `merge_user` instead
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merge_user": {
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merged_at": "2018-09-07T11:16:17.520Z",
"closed_by": null,
"closed_at": null,
"latest_build_started_at": "2018-09-07T07:27:38.472Z",
"latest_build_finished_at": "2018-09-07T08:07:06.012Z",
"first_deployed_to_production_at": null,
"pipeline": {
"id": 29626725,
"sha": "2be7ddb704c7b6b83732fdd5b9f09d5a397b5f8f",
"ref": "patch-28",
"status": "success",
"web_url": "https://gitlab.example.com/my-group/my-project/pipelines/29626725"
},
"diff_refs": {
"base_sha": "c380d3acebd181f13629a25d2e2acca46ffe1e00",
"head_sha": "2be7ddb704c7b6b83732fdd5b9f09d5a397b5f8f",
"start_sha": "c380d3acebd181f13629a25d2e2acca46ffe1e00"
},
"diverged_commits_count": 2,
"task_completion_status":{
"count":0,
"completed_count":0
}
}
专业版或更高级别的用户还可以看到 approvals_before_merge
参数:
{
"id": 1,
"title": "test1",
"approvals_before_merge": null
...
}
有关合并请求对象字段的说明,请阅读单个合并请求响应说明。
删除合并请求
仅使用于管理员和项目拥有者。删除一个合并请求。
DELETE /projects/:id/merge_requests/:merge_request_iid
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/4/merge_requests/85"
合并合并请求
接受并使用 API 合并一个合并请求。
PUT /projects/:id/merge_requests/:merge_request_iid/merge
参数:
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
merge_commit_message
| string | no | 合并提交的提交信息。 |
squash_commit_message
| string | no | 压缩合并的提交信息。 |
squash
| boolean | no | 若为 true 则合并时所有提交将会压缩为单个提交。
|
should_remove_source_branch
| boolean | no | 若为 true 则合并时删除源分支。
|
merge_when_pipeline_succeeds
| boolean | no | 若为 true 则合并请求在流水线通过时自动合并。
|
sha
| string | no | 如果提供此参数,则仅在头结点的 SHA 与提供值吻合时才执行合并。 |
{
"id": 1,
"iid": 1,
"project_id": 3,
"title": "test1",
"description": "fixed login page css paddings",
"state": "merged",
"created_at": "2017-04-29T08:46:00Z",
"updated_at": "2017-04-29T08:46:00Z",
"target_branch": "master",
"source_branch": "test1",
"upvotes": 0,
"downvotes": 0,
"author": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"assignee": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"assignees": [{
"name": "Miss Monserrate Beier",
"username": "axel.block",
"id": 12,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
"web_url": "https://gitlab.example.com/axel.block"
}],
"reviewers": [{
"name": "Miss Monserrate Beier",
"username": "axel.block",
"id": 12,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
"web_url": "https://gitlab.example.com/axel.block"
}],
"source_project_id": 2,
"target_project_id": 3,
"labels": [
"Community contribution",
"Manage"
],
"draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
"iid": 1,
"project_id": 3,
"title": "v2.0",
"description": "Assumenda aut placeat expedita exercitationem labore sunt enim earum.",
"state": "closed",
"created_at": "2015-02-02T19:49:26.013Z",
"updated_at": "2015-02-02T19:49:26.013Z",
"due_date": "2018-09-22",
"start_date": "2018-08-08",
"web_url": "https://gitlab.example.com/my-group/my-project/milestones/1"
},
"merge_when_pipeline_succeeds": true,
"merge_status": "can_be_merged",
"merge_error": null,
"sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1,
"discussion_locked": null,
"should_remove_source_branch": true,
"force_remove_source_branch": false,
"allow_collaboration": false,
"allow_maintainer_to_push": false,
"web_url": "http://gitlab.example.com/my-group/my-project/merge_requests/1",
"references": {
"short": "!1",
"relative": "!1",
"full": "my-group/my-project!1"
},
"time_stats": {
"time_estimate": 0,
"total_time_spent": 0,
"human_time_estimate": null,
"human_total_time_spent": null
},
"squash": false,
"subscribed": false,
"changes_count": "1",
"merged_by": { // Deprecated and will be removed in API v5, use `merge_user` instead
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merge_user": {
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merged_at": "2018-09-07T11:16:17.520Z",
"closed_by": null,
"closed_at": null,
"latest_build_started_at": "2018-09-07T07:27:38.472Z",
"latest_build_finished_at": "2018-09-07T08:07:06.012Z",
"first_deployed_to_production_at": null,
"pipeline": {
"id": 29626725,
"sha": "2be7ddb704c7b6b83732fdd5b9f09d5a397b5f8f",
"ref": "patch-28",
"status": "success",
"web_url": "https://gitlab.example.com/my-group/my-project/pipelines/29626725"
},
"diff_refs": {
"base_sha": "c380d3acebd181f13629a25d2e2acca46ffe1e00",
"head_sha": "2be7ddb704c7b6b83732fdd5b9f09d5a397b5f8f",
"start_sha": "c380d3acebd181f13629a25d2e2acca46ffe1e00"
},
"diverged_commits_count": 2,
"task_completion_status":{
"count":0,
"completed_count":0
}
}
专业版或更高级别的用户还可以看到 approvals_before_merge
参数:
{
"id": 1,
"title": "test1",
"approvals_before_merge": null
...
}
在操作失败的时候,API 会返回下面的这些 HTTP 状态码:
HTTP 状态码 | 信息 | 原因 |
---|---|---|
401
| Unauthorized
| 这个用户没有接受这个合并请求的权限。 |
405
| Method Not Allowed
| 这个合并请求不能被接受,这是因为它还处于 Draft 、Closed 、Pipeline Pending Completion 或 Failed 状态。只有 Success 的合并请求才能被接受。
|
406
| Branch cannot be merged
| 合并请求无法被合并。 |
409
| SHA does not match HEAD of source branch
| 提供的 sha 参数和分支头节点提交不符。
|
有关合并请求对象字段的说明,请阅读单个合并请求响应说明。
合并至默认 ref 路径
在可能的情况下将合并请求源分支和目标分支之间的改动合并到目标项目仓库的 refs/merge-requests/:iid/merge
。
如果有定期地进行合并,此 ref 应具有跟目标分支一致的状态。
这不是常规的合并操作,因为它不会以任何方式更改合并请求目标分支的状态。
当通过 API 提交请求时,这个 ref(refs/merge-requests/:iid/merge
)不一定会被覆盖,
尽管我们确保 ref 具有最新的可能状态。
如果合并请求有冲突、为空或已被合并,您会收到 400
和一则错误消息。
如果响应的是 200
,它会在响应正文中返回 refs/merge-requests/:iid/merge
的头结点提交。
GET /projects/:id/merge_requests/:merge_request_iid/merge_ref
参数:
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
{
"commit_id": "854a3a7a17acbcc0bbbea170986df1eb60435f34"
}
取消流水线通过自动合并
在操作失败的时候,API 会返回下面的这些 HTTP 状态码:
HTTP 状态码 | 信息 | 原因 |
---|---|---|
401
| Unauthorized
| 这个用户没有取消合并请求合并的权限。 |
405
| Method Not Allowed
| 这个合并请求已经被合并或已经被关闭。 |
406
| Not Acceptable
| 这个合并请求并不会在流水线通过时被自动合并。 |
POST /projects/:id/merge_requests/:merge_request_iid/cancel_merge_when_pipeline_succeeds
参数:
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
{
"id": 1,
"iid": 1,
"project_id": 3,
"title": "test1",
"description": "fixed login page css paddings",
"state": "merged",
"created_at": "2017-04-29T08:46:00Z",
"updated_at": "2017-04-29T08:46:00Z",
"target_branch": "master",
"source_branch": "test1",
"upvotes": 0,
"downvotes": 0,
"author": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"assignee": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"assignees": [{
"name": "Miss Monserrate Beier",
"username": "axel.block",
"id": 12,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
"web_url": "https://gitlab.example.com/axel.block"
}],
"reviewers": [{
"name": "Miss Monserrate Beier",
"username": "axel.block",
"id": 12,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
"web_url": "https://gitlab.example.com/axel.block"
}],
"source_project_id": 2,
"target_project_id": 3,
"labels": [
"Community contribution",
"Manage"
],
"draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
"iid": 1,
"project_id": 3,
"title": "v2.0",
"description": "Assumenda aut placeat expedita exercitationem labore sunt enim earum.",
"state": "closed",
"created_at": "2015-02-02T19:49:26.013Z",
"updated_at": "2015-02-02T19:49:26.013Z",
"due_date": "2018-09-22",
"start_date": "2018-08-08",
"web_url": "https://gitlab.example.com/my-group/my-project/milestones/1"
},
"merge_when_pipeline_succeeds": false,
"merge_status": "can_be_merged",
"merge_error": null,
"sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1,
"discussion_locked": null,
"should_remove_source_branch": true,
"force_remove_source_branch": false,
"allow_collaboration": false,
"allow_maintainer_to_push": false,
"web_url": "http://gitlab.example.com/my-group/my-project/merge_requests/1",
"references": {
"short": "!1",
"relative": "!1",
"full": "my-group/my-project!1"
},
"time_stats": {
"time_estimate": 0,
"total_time_spent": 0,
"human_time_estimate": null,
"human_total_time_spent": null
},
"squash": false,
"subscribed": false,
"changes_count": "1",
"merged_by": { // Deprecated and will be removed in API v5, use `merge_user` instead
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merge_user": {
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merged_at": "2018-09-07T11:16:17.520Z",
"closed_by": null,
"closed_at": null,
"latest_build_started_at": "2018-09-07T07:27:38.472Z",
"latest_build_finished_at": "2018-09-07T08:07:06.012Z",
"first_deployed_to_production_at": null,
"pipeline": {
"id": 29626725,
"sha": "2be7ddb704c7b6b83732fdd5b9f09d5a397b5f8f",
"ref": "patch-28",
"status": "success",
"web_url": "https://gitlab.example.com/my-group/my-project/pipelines/29626725"
},
"diff_refs": {
"base_sha": "c380d3acebd181f13629a25d2e2acca46ffe1e00",
"head_sha": "2be7ddb704c7b6b83732fdd5b9f09d5a397b5f8f",
"start_sha": "c380d3acebd181f13629a25d2e2acca46ffe1e00"
},
"diverged_commits_count": 2,
"task_completion_status":{
"count":0,
"completed_count":0
}
}
专业版或更高级别的用户还可以看到 approvals_before_merge
参数:
{
"id": 1,
"title": "test1",
"approvals_before_merge": null
...
}
有关合并请求对象字段的说明,请阅读单个合并请求响应说明。
合并请求变基
自动将合并请求的 source_branch
变基到 target_branch
上。
如果您无权推送到合并请求的源分支,您将收到 403 Forbidden
响应。
PUT /projects/:id/merge_requests/:merge_request_iid/rebase
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
skip_ci
| boolean | no | 设置为 true 以跳过流水线创建。
|
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/76/merge_requests/1/rebase"
这是一个异步请求。如果请求被成功添加到队列则会响应 HTTP 202 Accepted
:
{
"rebase_in_progress": true
}
您可以使用获取单个合并请求端点的 include_rebase_in_progress
参数
来轮询检查异步请求状态。
如果变基操作正在进行,则响应包括以下内容:
{
"rebase_in_progress": true,
"merge_error": null
}
在变基操作成功的时候,响应内容如下:
{
"rebase_in_progress": false,
"merge_error": null
}
在变基操作成功的时候,响应内容如下:
{
"rebase_in_progress": false,
"merge_error": "Rebase failed. Please rebase locally"
}
合并请求评论
评论相关操作由备注的相关接口实现。
列出合并时关闭的议题
列出在一个合并请求被合并时会自动关闭的议题。
GET /projects/:id/merge_requests/:merge_request_iid/closes_issues
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/76/merge_requests/1/closes_issues"
当使用极狐GitLab 议题管理时的示例响应信息:
[
{
"state" : "opened",
"description" : "Ratione dolores corrupti mollitia soluta quia.",
"author" : {
"state" : "active",
"id" : 18,
"web_url" : "https://gitlab.example.com/eileen.lowe",
"name" : "Alexandra Bashirian",
"avatar_url" : null,
"username" : "eileen.lowe"
},
"milestone" : {
"project_id" : 1,
"description" : "Ducimus nam enim ex consequatur cumque ratione.",
"state" : "closed",
"due_date" : null,
"iid" : 2,
"created_at" : "2016-01-04T15:31:39.996Z",
"title" : "v4.0",
"id" : 17,
"updated_at" : "2016-01-04T15:31:39.996Z"
},
"project_id" : 1,
"assignee" : {
"state" : "active",
"id" : 1,
"name" : "Administrator",
"web_url" : "https://gitlab.example.com/root",
"avatar_url" : null,
"username" : "root"
},
"updated_at" : "2016-01-04T15:31:51.081Z",
"id" : 76,
"title" : "Consequatur vero maxime deserunt laboriosam est voluptas dolorem.",
"created_at" : "2016-01-04T15:31:51.081Z",
"iid" : 6,
"labels" : [],
"user_notes_count": 1,
"changes_count": "1"
}
]
当使用外部议题管理(例如 Jira)时的示例响应信息:
[
{
"id" : "PROJECT-123",
"title" : "Title of this issue"
}
]
订阅合并请求
经过身份验证的用户可以订阅合并请求以接收该议题的通知。
如果用户已经订阅了某个合并请求,将返回 HTTP 304 Not Modified
状态码。
POST /projects/:id/merge_requests/:merge_request_iid/subscribe
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/merge_requests/17/subscribe"
响应示例:
{
"id": 1,
"iid": 1,
"project_id": 3,
"title": "test1",
"description": "fixed login page css paddings",
"state": "merged",
"created_at": "2017-04-29T08:46:00Z",
"updated_at": "2017-04-29T08:46:00Z",
"target_branch": "master",
"source_branch": "test1",
"upvotes": 0,
"downvotes": 0,
"author": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"assignee": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"assignees": [{
"name": "Miss Monserrate Beier",
"username": "axel.block",
"id": 12,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
"web_url": "https://gitlab.example.com/axel.block"
}],
"reviewers": [{
"name": "Miss Monserrate Beier",
"username": "axel.block",
"id": 12,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
"web_url": "https://gitlab.example.com/axel.block"
}],
"source_project_id": 2,
"target_project_id": 3,
"labels": [
"Community contribution",
"Manage"
],
"draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
"iid": 1,
"project_id": 3,
"title": "v2.0",
"description": "Assumenda aut placeat expedita exercitationem labore sunt enim earum.",
"state": "closed",
"created_at": "2015-02-02T19:49:26.013Z",
"updated_at": "2015-02-02T19:49:26.013Z",
"due_date": "2018-09-22",
"start_date": "2018-08-08",
"web_url": "https://gitlab.example.com/my-group/my-project/milestones/1"
},
"merge_when_pipeline_succeeds": true,
"merge_status": "can_be_merged",
"sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1,
"discussion_locked": null,
"should_remove_source_branch": true,
"force_remove_source_branch": false,
"allow_collaboration": false,
"allow_maintainer_to_push": false,
"web_url": "http://gitlab.example.com/my-group/my-project/merge_requests/1",
"references": {
"short": "!1",
"relative": "!1",
"full": "my-group/my-project!1"
},
"time_stats": {
"time_estimate": 0,
"total_time_spent": 0,
"human_time_estimate": null,
"human_total_time_spent": null
},
"squash": false,
"subscribed": false,
"changes_count": "1",
"merged_by": { // Deprecated and will be removed in API v5, use `merge_user` instead
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merge_user": {
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merged_at": "2018-09-07T11:16:17.520Z",
"closed_by": null,
"closed_at": null,
"latest_build_started_at": "2018-09-07T07:27:38.472Z",
"latest_build_finished_at": "2018-09-07T08:07:06.012Z",
"first_deployed_to_production_at": null,
"pipeline": {
"id": 29626725,
"sha": "2be7ddb704c7b6b83732fdd5b9f09d5a397b5f8f",
"ref": "patch-28",
"status": "success",
"web_url": "https://gitlab.example.com/my-group/my-project/pipelines/29626725"
},
"diff_refs": {
"base_sha": "c380d3acebd181f13629a25d2e2acca46ffe1e00",
"head_sha": "2be7ddb704c7b6b83732fdd5b9f09d5a397b5f8f",
"start_sha": "c380d3acebd181f13629a25d2e2acca46ffe1e00"
},
"diverged_commits_count": 2,
"task_completion_status":{
"count":0,
"completed_count":0
}
}
专业版或更高级别的用户还可以看到 approvals_before_merge
参数:
{
"id": 1,
"title": "test1",
"approvals_before_merge": null
...
}
有关合并请求对象字段的说明,请阅读单个合并请求响应说明。
取消订阅合并请求
经过身份验证的用户可以取消订阅合并请求以不再接收该合并请求的通知。
如果用户并没有订阅这个合并请求,将返回 HTTP 304 Not Modified
状态码。
POST /projects/:id/merge_requests/:merge_request_iid/unsubscribe
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/merge_requests/17/unsubscribe"
响应示例:
{
"id": 1,
"iid": 1,
"project_id": 3,
"title": "test1",
"description": "fixed login page css paddings",
"state": "merged",
"created_at": "2017-04-29T08:46:00Z",
"updated_at": "2017-04-29T08:46:00Z",
"target_branch": "master",
"source_branch": "test1",
"upvotes": 0,
"downvotes": 0,
"author": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"assignee": {
"id": 1,
"name": "Administrator",
"username": "admin",
"state": "active",
"avatar_url": null,
"web_url" : "https://gitlab.example.com/admin"
},
"assignees": [{
"name": "Miss Monserrate Beier",
"username": "axel.block",
"id": 12,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
"web_url": "https://gitlab.example.com/axel.block"
}],
"reviewers": [{
"name": "Miss Monserrate Beier",
"username": "axel.block",
"id": 12,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
"web_url": "https://gitlab.example.com/axel.block"
}],
"source_project_id": 2,
"target_project_id": 3,
"labels": [
"Community contribution",
"Manage"
],
"draft": false,
"work_in_progress": false,
"milestone": {
"id": 5,
"iid": 1,
"project_id": 3,
"title": "v2.0",
"description": "Assumenda aut placeat expedita exercitationem labore sunt enim earum.",
"state": "closed",
"created_at": "2015-02-02T19:49:26.013Z",
"updated_at": "2015-02-02T19:49:26.013Z",
"due_date": "2018-09-22",
"start_date": "2018-08-08",
"web_url": "https://gitlab.example.com/my-group/my-project/milestones/1"
},
"merge_when_pipeline_succeeds": true,
"merge_status": "can_be_merged",
"sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1,
"discussion_locked": null,
"should_remove_source_branch": true,
"force_remove_source_branch": false,
"allow_collaboration": false,
"allow_maintainer_to_push": false,
"web_url": "http://gitlab.example.com/my-group/my-project/merge_requests/1",
"references": {
"short": "!1",
"relative": "!1",
"full": "my-group/my-project!1"
},
"time_stats": {
"time_estimate": 0,
"total_time_spent": 0,
"human_time_estimate": null,
"human_total_time_spent": null
},
"squash": false,
"subscribed": false,
"changes_count": "1",
"merged_by": { // Deprecated and will be removed in API v5, use `merge_user` instead
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merge_user": {
"id": 87854,
"name": "Douwe Maan",
"username": "DouweM",
"state": "active",
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
"web_url": "https://gitlab.com/DouweM"
},
"merged_at": "2018-09-07T11:16:17.520Z",
"closed_by": null,
"closed_at": null,
"latest_build_started_at": "2018-09-07T07:27:38.472Z",
"latest_build_finished_at": "2018-09-07T08:07:06.012Z",
"first_deployed_to_production_at": null,
"pipeline": {
"id": 29626725,
"sha": "2be7ddb704c7b6b83732fdd5b9f09d5a397b5f8f",
"ref": "patch-28",
"status": "success",
"web_url": "https://gitlab.example.com/my-group/my-project/pipelines/29626725"
},
"diff_refs": {
"base_sha": "c380d3acebd181f13629a25d2e2acca46ffe1e00",
"head_sha": "2be7ddb704c7b6b83732fdd5b9f09d5a397b5f8f",
"start_sha": "c380d3acebd181f13629a25d2e2acca46ffe1e00"
},
"diverged_commits_count": 2,
"task_completion_status":{
"count":0,
"completed_count":0
}
}
专业版或更高级别的用户还可以看到 approvals_before_merge
参数:
{
"id": 1,
"title": "test1",
"approvals_before_merge": null
...
}
有关合并请求对象字段的说明,请阅读单个合并请求响应说明。
创建待办事项
为当前用户基于某个合并请求手动创建待办事项。
如果这个合并请求已经是用户的待办事项,将返回 HTTP 304 Not Modified
状态码。
POST /projects/:id/merge_requests/:merge_request_iid/todo
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/merge_requests/27/todo"
响应示例:
{
"id": 113,
"project": {
"id": 3,
"name": "GitLab CI/CD",
"name_with_namespace": "GitLab Org / GitLab CI/CD",
"path": "gitlab-ci",
"path_with_namespace": "gitlab-org/gitlab-ci"
},
"author": {
"name": "Administrator",
"username": "root",
"id": 1,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
"web_url": "https://gitlab.example.com/root"
},
"action_name": "marked",
"target_type": "MergeRequest",
"target": {
"id": 27,
"iid": 7,
"project_id": 3,
"title": "Et voluptas laudantium minus nihil recusandae ut accusamus earum aut non.",
"description": "Veniam sunt nihil modi earum cumque illum delectus. Nihil ad quis distinctio quia. Autem eligendi at quibusdam repellendus.",
"state": "merged",
"created_at": "2016-06-17T07:48:04.330Z",
"updated_at": "2016-07-01T11:14:15.537Z",
"target_branch": "allow_regex_for_project_skip_ref",
"source_branch": "backup",
"upvotes": 0,
"downvotes": 0,
"author": {
"name": "Jarret O'Keefe",
"username": "francisca",
"id": 14,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/a7fa515d53450023c83d62986d0658a8?s=80&d=identicon",
"web_url": "https://gitlab.example.com/francisca",
"discussion_locked": false
},
"assignee": {
"name": "Dr. Gabrielle Strosin",
"username": "barrett.krajcik",
"id": 4,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/733005fcd7e6df12d2d8580171ccb966?s=80&d=identicon",
"web_url": "https://gitlab.example.com/barrett.krajcik"
},
"assignees": [{
"name": "Miss Monserrate Beier",
"username": "axel.block",
"id": 12,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
"web_url": "https://gitlab.example.com/axel.block"
}],
"reviewers": [{
"name": "Miss Monserrate Beier",
"username": "axel.block",
"id": 12,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
"web_url": "https://gitlab.example.com/axel.block"
}],
"source_project_id": 3,
"target_project_id": 3,
"labels": [],
"draft": false,
"work_in_progress": false,
"milestone": {
"id": 27,
"iid": 2,
"project_id": 3,
"title": "v1.0",
"description": "Quis ea accusantium animi hic fuga assumenda.",
"state": "active",
"created_at": "2016-06-17T07:47:33.840Z",
"updated_at": "2016-06-17T07:47:33.840Z",
"due_date": null
},
"merge_when_pipeline_succeeds": false,
"merge_status": "unchecked",
"subscribed": true,
"sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 7,
"changes_count": "1",
"should_remove_source_branch": true,
"force_remove_source_branch": false,
"squash": false,
"web_url": "http://example.com/my-group/my-project/merge_requests/1",
"references": {
"short": "!1",
"relative": "!1",
"full": "my-group/my-project!1"
}
},
"target_url": "https://gitlab.example.com/gitlab-org/gitlab-ci/merge_requests/7",
"body": "Et voluptas laudantium minus nihil recusandae ut accusamus earum aut non.",
"state": "pending",
"created_at": "2016-07-01T11:14:15.530Z"
}
获取合并请求差异版本
获取合并请求的一系列差异版本。有关响应中的 SHA,请阅读API 响应中的 SHA 一节。
GET /projects/:id/merge_requests/:merge_request_iid/versions
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| String | yes | 项目的 ID。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/merge_requests/1/versions"
响应示例:
[{
"id": 110,
"head_commit_sha": "33e2ee8579fda5bc36accc9c6fbd0b4fefda9e30",
"base_commit_sha": "eeb57dffe83deb686a60a71c16c32f71046868fd",
"start_commit_sha": "eeb57dffe83deb686a60a71c16c32f71046868fd",
"created_at": "2016-07-26T14:44:48.926Z",
"merge_request_id": 105,
"state": "collected",
"real_size": "1"
}, {
"id": 108,
"head_commit_sha": "3eed087b29835c48015768f839d76e5ea8f07a24",
"base_commit_sha": "eeb57dffe83deb686a60a71c16c32f71046868fd",
"start_commit_sha": "eeb57dffe83deb686a60a71c16c32f71046868fd",
"created_at": "2016-07-25T14:21:33.028Z",
"merge_request_id": 105,
"state": "collected",
"real_size": "1"
}]
API 响应中的 SHA
SHA 字段 | 用处 |
---|---|
head_commit_sha
| 源分支的 HEAD提交。 |
base_commit_sha
| 源分支和目标分支的 merge-base 提交。 |
start_commit_sha
| 当这一版的变更创建时目标分支的 HEAD 提交。 |
获取单个合并请求差异版本
获取合并请求的某一个差异版本。有关响应中的 SHA,请阅读API 响应中的 SHA 一节。
GET /projects/:id/merge_requests/:merge_request_iid/versions/:version_id
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| String | yes | 项目的 ID。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
version_id
| integer | yes | 差异版本的 ID。 |
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/merge_requests/1/versions/1"
响应示例:
{
"id": 110,
"head_commit_sha": "33e2ee8579fda5bc36accc9c6fbd0b4fefda9e30",
"base_commit_sha": "eeb57dffe83deb686a60a71c16c32f71046868fd",
"start_commit_sha": "eeb57dffe83deb686a60a71c16c32f71046868fd",
"created_at": "2016-07-26T14:44:48.926Z",
"merge_request_id": 105,
"state": "collected",
"real_size": "1",
"commits": [{
"id": "33e2ee8579fda5bc36accc9c6fbd0b4fefda9e30",
"short_id": "33e2ee85",
"title": "Change year to 2018",
"author_name": "Administrator",
"author_email": "admin@example.com",
"created_at": "2016-07-26T17:44:29.000+03:00",
"message": "Change year to 2018"
}, {
"id": "aa24655de48b36335556ac8a3cd8bb521f977cbd",
"short_id": "aa24655d",
"title": "Update LICENSE",
"author_name": "Administrator",
"author_email": "admin@example.com",
"created_at": "2016-07-25T17:21:53.000+03:00",
"message": "Update LICENSE"
}, {
"id": "3eed087b29835c48015768f839d76e5ea8f07a24",
"short_id": "3eed087b",
"title": "Add license",
"author_name": "Administrator",
"author_email": "admin@example.com",
"created_at": "2016-07-25T17:21:20.000+03:00",
"message": "Add license"
}],
"diffs": [{
"old_path": "LICENSE",
"new_path": "LICENSE",
"a_mode": "0",
"b_mode": "100644",
"diff": "--- /dev/null\n+++ b/LICENSE\n@@ -0,0 +1,21 @@\n+The MIT License (MIT)\n+\n+Copyright (c) 2018 Administrator\n+\n+Permission is hereby granted, free of charge, to any person obtaining a copy\n+of this software and associated documentation files (the \"Software\"), to deal\n+in the Software without restriction, including without limitation the rights\n+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n+copies of the Software, and to permit persons to whom the Software is\n+furnished to do so, subject to the following conditions:\n+\n+The above copyright notice and this permission notice shall be included in all\n+copies or substantial portions of the Software.\n+\n+THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n+SOFTWARE.\n",
"new_file": true,
"renamed_file": false,
"deleted_file": false
}]
}
为合并提交设置预计用时
为某个合并提交设置您预计需要在其所耗费的时间。
POST /projects/:id/merge_requests/:merge_request_iid/time_estimate
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
duration
| string | yes | 预计用时,如 3h30m
|
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/merge_requests/93/time_estimate?duration=3h30m"
响应示例:
{
"human_time_estimate": "3h 30m",
"human_total_time_spent": null,
"time_estimate": 12600,
"total_time_spent": 0
}
为合并请求重置预计用时
将合并请求的预计用时重置为零。
POST /projects/:id/merge_requests/:merge_request_iid/reset_time_estimate
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 项目合并请求的内部 ID。 |
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/merge_requests/93/reset_time_estimate"
响应示例:
{
"human_time_estimate": null,
"human_total_time_spent": null,
"time_estimate": 0,
"total_time_spent": 0
}
为合并请求添加已用时间
为合并请求添加您已经在其耗费的时间。
POST /projects/:id/merge_requests/:merge_request_iid/add_spent_time
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
duration
| string | yes | 所耗费的时间,如 3h30m 。
|
summary
| string | no | 简要描述这段时间是如何耗费的。 |
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/merge_requests/93/add_spent_time?duration=1h"
响应示例:
{
"human_time_estimate": null,
"human_total_time_spent": "1h",
"time_estimate": 0,
"total_time_spent": 3600
}
为合并请求重置已用时间
将合并请求的已用时间重置为零。
POST /projects/:id/merge_requests/:merge_request_iid/reset_spent_time
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 项目合并请求的内部 ID。 |
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/merge_requests/93/reset_spent_time"
响应示例:
{
"human_time_estimate": null,
"human_total_time_spent": null,
"time_estimate": 0,
"total_time_spent": 0
}
GET /projects/:id/merge_requests/:merge_request_iid/time_stats
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | 经过身份验证的用户拥有的项目 ID 或经过 URL 编码处理的路径。 |
merge_request_iid
| integer | yes | 合并请求的内部 ID。 |
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/merge_requests/93/time_stats"
响应示例:
{
"human_time_estimate": "2h",
"human_total_time_spent": "1h",
"time_estimate": 7200,
"total_time_spent": 3600
}
核准
请阅读核准合并请求一文了解更多信息。
列出合并请求状态事件
要追踪合并请求当前状态、由谁设置、发生时间,可移步资源状态事件 API。