合并请求故障排查

  • Tier: 基础版, 专业版, 旗舰版
  • Offering: JihuLab.com, 私有化部署

在处理合并请求时,您可能会遇到以下问题。

合并请求无法检索流水线状态#

如果 Sidekiq 没有足够快地接收更改,这种情况可能会发生。

Sidekiq#

Sidekiq 没有足够快地处理 CI 状态更改。等待几秒钟,状态应该会自动更新。

无法检索流水线状态#

在以下情况下,合并请求的流水线状态无法检索:

  1. 创建合并请求
  2. 合并请求被关闭
  3. 项目中进行了更改
  4. 重新打开合并请求

要使流水线状态能够正确检索,请关闭并重新打开合并请求。

从 Rails 控制台重新基准合并请求#

  • Tier: 基础版, 专业版, 旗舰版

除了 /rebase 快速操作之外,具有访问 Rails 控制台权限的用户可以从 Rails 控制台重新基准合并请求。用适当的值替换 <username><namespace/project><iid>

任何直接更改数据的命令如果未正确运行或在正确的条件下运行,可能会造成损害。我们强烈建议在测试环境中运行它们,并准备好可以恢复的实例备份,以防万一。
ruby
u = User.find_by_username('<username>') p = Project.find_by_full_path('<namespace/project>') m = p.merge_requests.find_by(iid: <iid>) MergeRequests::RebaseService.new(project: m.target_project, current_user: u).execute(m)

修复错误的合并请求状态#

  • Tier: 基础版, 专业版, 旗舰版
  • Offering: 私有化部署

如果合并请求在其更改合并后仍然 Open,具有访问 Rails 控制台权限的用户可以更正合并请求的状态。用适当的值替换 <username><namespace/project><iid>

任何直接更改数据的命令如果未正确运行或在正确的条件下运行,可能会造成损害。我们强烈建议在测试环境中运行它们,并准备好可以恢复的实例备份,以防万一。
ruby
u = User.find_by_username('<username>') p = Project.find_by_full_path('<namespace/project>') m = p.merge_requests.find_by(iid: <iid>) MergeRequests::PostMergeService.new(project: p, current_user: u).execute(m)

对具有未合并更改的合并请求运行此命令将导致合并请求显示错误消息:merged into <branch-name>

从 Rails 控制台关闭合并请求#

  • Tier: 基础版, 专业版, 旗舰版
  • Offering: 私有化部署

如果通过 UI 或 API 无法关闭合并请求,请尝试在 Rails 控制台会话中关闭它:

更改数据的命令如果未正确运行或在正确的条件下运行,可能会造成损害。始终首先在测试环境中运行命令,并准备好可恢复的实例备份。
ruby
u = User.find_by_username('<username>') p = Project.find_by_full_path('<namespace/project>') m = p.merge_requests.find_by(iid: <iid>) MergeRequests::CloseService.new(project: p, current_user: u).execute(m)

从 Rails 控制台删除合并请求#

  • Tier: 基础版, 专业版, 旗舰版
  • Offering: 私有化部署

如果通过 UI 或 API 无法删除合并请求,请尝试在 Rails 控制台会话中删除它:

任何直接更改数据的命令如果未正确运行或在正确的条件下运行,可能会造成损害。我们强烈建议在测试环境中运行它们,并准备好可以恢复的实例备份,以防万一。
ruby
u = User.find_by_username('<username>') p = Project.find_by_full_path('<namespace/project>') m = p.merge_requests.find_by(iid: <iid>) Issuable::DestroyService.new(container: m.project, current_user: u).execute(m)

合并请求预接收钩子失败#

如果合并请求超时,您可能会看到指示 Puma 工作线程超时问题的消息:

  • 在极狐GitLab UI 中:

    plaintext
    Something went wrong during merge pre-receive hook. 500 Internal Server Error. Try again.
  • gitlab-rails/api_json.log 日志文件中:

    plaintext
    Rack::Timeout::RequestTimeoutException Request ran for longer than 60000ms

如果您的合并请求包含许多差异、落后于目标分支很多提交或引用了锁定的 Git LFS 文件,可能会发生此错误。极狐GitLab私有化部署的用户可以请求管理员查看服务器日志以确定错误原因。极狐GitLab SaaS 用户应 联系支持以获取帮助。

缓存的合并请求计数#

在群组中,侧边栏显示打开的合并请求的总数。如果该值大于 1000,则该值将被缓存。缓存的值四舍五入为千(或百万),并每 24 小时更新一次。

通过 head 引用在本地签出合并请求#

History
    • 在极狐GitLab私有化部署和 JihuLab.com 上,合并请求关闭或合并后 14 天删除 head 引用在极狐GitLab 16.4 中启用。
    • 在极狐GitLab 16.6 中,合并请求关闭或合并后 14 天删除 head 引用 GA。功能标志 merge_request_refs_cleanup 被删除。

合并请求包含存储库的所有历史记录,以及添加到与合并请求关联的分支的额外提交。以下是几种在本地签出合并请求的方法。即使源项目是目标项目的分支(即使是私有分支),您也可以在本地签出合并请求。这依赖于每个合并请求可用的合并请求 head 引用(refs/merge-requests/:iid/head)。它允许使用其 ID 而不是其分支来签出合并请求。在极狐GitLab 16.6 及更高版本中,合并请求关闭或合并后 14 天删除合并请求 head 引用。合并请求然后不再可用于从合并请求 head 引用进行本地签出。合并请求仍然可以重新打开。如果合并请求的分支存在,您仍然可以签出该分支,因为它不受影响。

使用 glab 在本地签出#

plaintext
glab mr checkout <merge_request_iid>

有关 极狐GitLab 终端客户端的更多信息。

通过添加 Git 别名在本地签出#

将以下别名添加到您的 ~/.gitconfig

plaintext
[alias] mr = !sh -c 'git fetch $1 merge-requests/$2/head:mr-$1-$2 && git checkout mr-$1-$2' -

现在,您可以从任何存储库和任何远程签出特定的合并请求。例如,要从 origin 远程签出极狐GitLab 中显示的 ID 为 5 的合并请求,请执行以下操作:

shell
git mr origin 5

这会将合并请求提取到本地 mr-origin-5 分支并签出。

通过修改特定存储库的 .git/config 在本地签出#

.git/config 文件中找到极狐GitLab 远程的部分。它看起来像这样:

plaintext
[remote "origin"] url = https://jihulab.com/gitlab-cn/gitlab-foss.git fetch = +refs/heads/*:refs/remotes/origin/*

您可以使用以下命令打开文件:

shell
git config -e

现在,将以下行添加到上述部分:

plaintext
fetch = +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*

最后,它应该看起来像这样:

plaintext
[remote "origin"] url = https://jihulab.com/gitlab-cn/gitlab-foss.git fetch = +refs/heads/*:refs/remotes/origin/* fetch = +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*

现在您可以提取所有合并请求:

shell
1git fetch origin 2 3... 4From https://jihulab.com/gitlab-cn/gitlab-foss.git 5 * [new ref] refs/merge-requests/1/head -> origin/merge-requests/1 6 * [new ref] refs/merge-requests/2/head -> origin/merge-requests/2 7...

要签出特定的合并请求:

shell
git checkout origin/merge-requests/1

以上所有操作都可以使用 git-mr 脚本完成。

错误:“源分支 <branch_name> 不存在。”当分支存在时#

如果极狐GitLab 缓存未反映 Git 存储库的实际状态,可能会发生此错误。如果 Git 数据文件夹使用 noexec 标志挂载,则可能会发生这种情况。

先决条件:

  • 您必须是管理员。

要强制更新缓存:

  1. 使用以下命令打开极狐GitLab Rails 控制台:

    shell
    sudo gitlab-rails console
  2. 在 Rails 控制台中,运行此脚本:

    ruby
    1# 获取项目 2project = Project.find_by_full_path('affected/project/path') 3 4# 检查受影响的分支是否存在于缓存中(可能返回 `false`) 5project.repository.branch_names.include?('affected_branch_name') 6 7# 过期分支缓存 8project.repository.expire_branches_cache 9 10# 再次检查受影响的分支是否存在于缓存中(这次应该返回 `true`) 11project.repository.branch_names.include?('affected_branch_name')
  3. 重新加载合并请求。