尝试初始化合并请求源时repo init执行失败的问题求助
Let's break down what's going wrong here and fix it step by step:
1. Why your first repo init command failed
The invalid refspec error happens because you accidentally duplicated the refspec pattern. When defining a refspec for fetching remote refs, the correct format is +<source-ref>:<dest-ref> — your command ended up creating a malformed refspec with the pattern repeated twice. Even if you fixed that, the repo init -b parameter isn’t designed to handle wildcard refspecs like refs/merge-requests/*/head for bulk fetching merge requests. We’ll cover a better approach for bulk fetching later.
2. Why the second command couldn't find the remote ref
GitLab stores merge request head refs under refs/merge-requests/<MR-number>/head, not under the standard refs/heads/ namespace. When you used -b merge-requests/5/head, the repo tool automatically prepended refs/heads/ to the branch name, so it was looking for refs/heads/merge-requests/5/head — which doesn’t exist. You need to specify the full, exact ref path to avoid this mismatch.
3. Fixes for your use cases
Option A: Clone a specific merge request for the manifest repository
If your goal is to use the manifest from merge request #5 in the project1.git repo, run this corrected repo init command (note the full ref path):
repo init -u http://gitlab.com/mn/project1.git -b refs/merge-requests/5/head -m tools/manifests/math.xml --no-clone-bundle
Option B: Fetch all merge requests for the manifest repository
If you want to pull all merge requests from the manifest repo for later use:
- First run a standard
repo init:repo init -u http://gitlab.com/mn/project1.git -m tools/manifests/math.xml --no-clone-bundle - Navigate to the local manifest repository:
cd .repo/manifests - Edit the
.git/configfile, and add this line under the[remote "origin"]section:fetch = +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/* - Fetch all the merge request refs:
git fetch origin
You’ll now have access to all MRs under refs/remotes/origin/merge-requests/.
Option C: Check out a merge request for a sub-project (e.g., proj1)
If you need to pull code from a merge request in the proj1 repo (not the manifest repo):
- Initialize the repo normally:
repo init -u http://gitlab.com/mn/project1.git -m tools/manifests/math.xml --no-clone-bundle - Sync the repo first:
repo sync - Navigate to the sub-project directory:
cd proj1 - Fetch the merge request ref and create a local branch:
git fetch MN refs/merge-requests/5/head:mr-5 - Check out the MR code:
git checkout mr-5
Alternatively, you can modify your math.xml manifest to point directly to the MR ref for proj1:
<manifest> <remote name="MN" fetch="http://gitlab.com/mn" /> <project name="proj1" remote="MN" path="proj1" revision="refs/merge-requests/5/head" /> <project name="proj2" remote="MN" path="proj2" revision="re1.4.0" /> </manifest>
Then run repo sync proj1 to pull the MR code directly.
内容的提问来源于stack exchange,提问作者Anjan

