マージリクエストのトラブルシューティング
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
マージリクエストの作業中に、次のイシューが発生する可能性があります。
マージリクエストがパイプラインの状態を取得できない
これは、Sidekiqが変更を十分に速く取得しない場合に発生する可能性があります。
Sidekiq
SidekiqがCIの状態変更を十分に速く処理しませんでした。数秒待つと、状態が自動的に更新されます。
パイプラインの状態を取得できない
次の状況が発生した場合、マージリクエストのパイプラインの状態を取得できません:
- マージリクエストが作成された
- マージリクエストが完了した
- プロジェクトに変更が加えられた
- マージリクエストが再開した
パイプラインの状態を適切に取得できるようにするには、マージリクエストを閉じて再度開いてください。
Railsコンソールからマージリクエストをリベースする
- プラン: Free、Premium、Ultimate
/rebase クイックアクションに加えて、Railsコンソールへのアクセス権を持つユーザーは、Railsコンソールからマージリクエストをリベースできます。<username>、<namespace/project>、<iid>を適切な値に置き換えます:
データを直接変更するコマンドは、正しく実行されなかった場合、または適切な条件下で実行されなかった場合、損害を与える可能性があります。念のため、インスタンスのバックアップを復元できるように準備し、Test環境で実行することを強くお勧めします。
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)正しくないマージリクエストの状態を修正する
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab Self-Managed、GitLab Dedicated
変更がマージされた後もマージリクエストがオープンのままの場合、Railsコンソールへのアクセス権を持つユーザーは、マージリクエストの状態を修正できます。<username>、<namespace/project>、<iid>を適切な値に置き換えます:
データを直接変更するコマンドは、正しく実行されなかった場合、または適切な条件下で実行されなかった場合、損害を与える可能性があります。念のため、インスタンスのバックアップを復元できるように準備し、Test環境で実行することを強くお勧めします。
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コンソールからマージリクエストを閉じる
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab Self-Managed、GitLab Dedicated
UIまたはAPIでマージリクエストを閉じることができない場合は、Railsコンソールセッションで閉じてみてください:
データを変更するコマンドは、正しく実行されなかった場合、または適切な条件下で実行されなかった場合、損害を与える可能性があります。最初にテスト環境でコマンドを実行し、復元できるバックアップインスタンスを準備してください。
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コンソールからマージリクエストを削除する
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab Self-Managed、GitLab Dedicated
UIまたはAPIでマージリクエストを削除できない場合は、Railsコンソールセッションで削除してみてください:
データを直接変更するコマンドは、正しく実行されなかった場合、または適切な条件下で実行されなかった場合、損害を与える可能性があります。念のため、インスタンスのバックアップを復元できるように準備し、Test環境で実行することを強くお勧めします。
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の場合:
Something went wrong during merge pre-receive hook. 500 Internal Server Error. Try again.gitlab-rails/api_json.loglogファイルの場合:Rack::Timeout::RequestTimeoutException Request ran for longer than 60000ms
このエラーは、マージリクエストが次の条件に該当する場合に発生する可能性があります:
- 多くの差分が含まれている。
- ターゲットブランチより多くのコミットが遅れている。
- ロックされているGit LFSファイルを参照している。
GitLab Self-Managedのユーザーは、管理者にサーバーlogのレビューをリクエストして、エラーの原因を特定できます。GitLab SaaSのユーザーは、サポートにお問い合わせください。
キャッシュされたマージリクエスト数
グループでは、サイドバーにオープンマージリクエストの合計数が表示されます。この値は、1000を超える場合にキャッシュされます。キャッシュされた値は、数千(または数百万)に丸められ、24時間ごとに更新されます。
head refを使用して、ローカルでマージリクエストをチェックアウトする
マージリクエストには、リポジトリのすべての履歴と、マージリクエストに関連付けられたブランチに追加されたコミットが含まれています。ローカルでマージリクエストをチェックアウトするいくつかの方法を以下に示します。
ソースプロジェクトがターゲットプロジェクトのフォーク(プライベートフォークを含む)であっても、ローカルでマージリクエストをチェックアウトできます。
これは、各マージリクエストで使用可能なマージリクエストのhead ref(refs/merge-requests/:iid/head)に基づいています。これにより、ブランチの代わりにそのIDを使用して、マージリクエストをチェックアウトできます。
GitLab 16.6以降、マージリクエストhead refは、マージリクエストが完了またはマージされてから14日後に削除されます。マージリクエストは、マージリクエストhead refからローカルにチェックアウトできなくなります。マージリクエストは再度開くことが可能です。マージリクエストのブランチが存在する場合、影響を受けないため、そのブランチをチェックアウトできます。
glabを使用してローカルでチェックアウトする
glab mr checkout <merge_request_iid>Gitエイリアスを追加して、ローカルでチェックアウトする
次のエイリアスを~/.gitconfigに追加します:
[alias]
mr = !sh -c 'git fetch $1 merge-requests/$2/head:mr-$1-$2 && git checkout mr-$1-$2' -これで、任意のリポジトリと任意のリモートから、特定のマージリクエストをチェックアウトできます。たとえば、GitLabに示されているoriginリモートからID 5のマージリクエストをチェックアウトするには、次のようにします:
git mr origin 5これにより、マージリクエストがローカルのmr-origin-5ブランチにフェッチされ、チェックアウトされます。
特定のリポジトリの.git/configを変更して、ローカルでチェックアウトする
.git/configファイルで、GitLabリモートのセクションを探します。次のようになります:
[remote "origin"]
url = https://gitlab.com/gitlab-org/gitlab-foss.git
fetch = +refs/heads/*:refs/remotes/origin/*次のコマンドを使用して、ファイルを開くことができます:
git config -eここで、次の行を前のセクションに追加します:
fetch = +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*最終的には、次のようになります:
[remote "origin"]
url = https://gitlab.com/gitlab-org/gitlab-foss.git
fetch = +refs/heads/*:refs/remotes/origin/*
fetch = +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*次に、すべてのマージリクエストをフェッチできます:
git fetch origin
...
From https://gitlab.com/gitlab-org/gitlab-foss.git
* [new ref] refs/merge-requests/1/head -> origin/merge-requests/1
* [new ref] refs/merge-requests/2/head -> origin/merge-requests/2
...特定のマージリクエストをチェックアウトするには:
git checkout origin/merge-requests/1これらのコマンドは、git-mrスクリプトでも実行できます。
ブランチが存在する場合のエラー: 「ソースブランチ<branch_name>が存在しません。」
このエラーは、GitLabのキャッシュがGitリポジトリの実際の状態を反映していない場合に発生する可能性があります。これは、Gitデータフォルダーがnoexecフラグを指定してマウントされている場合に発生する可能性があります。
前提要件:
- 管理者である必要があります。
キャッシュの更新を強制するには:
このコマンドでGitLab Railsコンソールを開きます:
sudo gitlab-rails consoleRailsコンソールで、このスクリプトを実行します:
# Get the project project = Project.find_by_full_path('affected/project/path') # Check if the affected branch exists in cache (it may return `false`) project.repository.branch_names.include?('affected_branch_name') # Expire the branches cache project.repository.expire_branches_cache # Check again if the affected branch exists in cache (this time it should return `true`) project.repository.branch_names.include?('affected_branch_name')マージリクエストをリロードします。
オートメーションがマージリクエストを承認すると、承認がリセットされる
マージリクエストの作成、またはマージリクエストへのプッシュを自動化する場合、それらのマージリクエストの自動承認を作成することを検討してください。GitLab PremiumとUltimateでは、デフォルトで、コミットがソースブランチに追加されると、すべての承認が削除されます。この問題を回避するには、マージリクエストを承認する前にコミットが処理されるようにするロジックをオートメーションに追加します。
マージリクエストmerged manually
マージされたマージリクエストにmerged manuallyシステムノートが含まれている場合、そのマージリクエストは、GitLab UIの外部でマージされたか、別のマージリクエストの一部としてマージされたコミットが含まれています。次に例を示します:
- マージリクエスト1は、
single-fixブランチ用であり、コミットcd87d6があります。 - マージリクエスト2は、
several-fixesブランチ用です。これには、コミットcd87d6とその他いくつか含まれています。
several-fixesブランチをマージすると、コミットcd87d6を含む、そのブランチ上のすべてのコミットがマージされます。ブランチsingle-fixでアクションが実行されていなくても、コミットcd87d6がseveral-fixesの一部としてマージされたため、single-fixはマージ済みとして表示されるようになりました。
詳細については、同じコミットを含む複数のブランチを参照してください。