获取GitLab子文件夹内文件信息时遭遇404错误问题
解决GitLab子文件夹文件404问题
核心问题定位
确实如你判断,问题出在代码仅获取了子文件夹的目录信息,没有递归遍历子文件夹内部的文件,或者请求文件时的路径拼接错误,导致GitLab API无法定位资源返回404。
具体修复方案
递归获取全量文件信息
调用GitLab API的projects/:id/repository/tree接口时,添加recursive=true参数,可一次性拉取所有层级的文件和文件夹,无需手动递归处理:import requests GITLAB_TOKEN = "你的访问令牌" PROJECT_ID = "目标项目ID" def fetch_all_repo_items(): api_url = f"https://gitlab.com/api/v4/projects/{PROJECT_ID}/repository/tree" request_params = { "recursive": "true", "access_token": GITLAB_TOKEN } resp = requests.get(api_url, params=request_params) resp.raise_for_status() return resp.json() # 获取所有目录项并过滤出文件 all_items = fetch_all_repo_items() file_list = [item for item in all_items if item["type"] == "blob"]正确拼接文件访问路径
获取到文件的path后,使用projects/:id/repository/files/:file_path/raw接口访问内容,注意对文件路径做URL编码:import urllib.parse def get_file_raw_content(file_path): encoded_path = urllib.parse.quote(file_path, safe='') file_api_url = f"https://gitlab.com/api/v4/projects/{PROJECT_ID}/repository/files/{encoded_path}/raw" resp = requests.get(file_api_url, params={"access_token": GITLAB_TOKEN}) resp.raise_for_status() return resp.text # 示例:遍历子文件夹内的文件并获取内容 for file in file_list: if "subfolder/" in file["path"]: content = get_file_raw_content(file["path"]) print(f"文件 {file['path']} 预览:{content[:100]}...")校验令牌权限
确认你的GitLab访问令牌已勾选read_repository权限,无此权限时即使路径正确也会返回404,可在GitLab个人设置的「访问令牌」页面调整权限。
验证方式
运行代码后打印所有文件的path,确认子文件夹内的文件已被纳入列表,再尝试请求几个文件的内容,检查是否能正常返回。
内容的提问来源于stack exchange,提问作者Parvus kötü adam
相关产品推荐
相关产品推荐

