如何在不使用 import_url 的情况下将特定文件导入新创建的 Gitlab 项目?
Posted
技术标签:
【中文标题】如何在不使用 import_url 的情况下将特定文件导入新创建的 Gitlab 项目?【英文标题】:How to import a specific file to a newly created Gitlab project without using import_url? 【发布时间】:2021-12-02 00:21:05 【问题描述】:在创建新项目时,我曾经从仅包含该单个文件的父存储库中导入特定文件,因此可以将其作为一个整体导入。
包含对https://gitlab.example.com/api/v4/projects/
的单个POST
请求的完整操作,发送有效载荷如下:
"name": "The New Great Project III",
"namespace_id": 12,
"description": "A Project",
"import_url": "https://user:users_token@gitlab.example.com/great-projects/0-0_parent_project.git"
用于使用从父项目导入的单个文件创建新项目的操作,用户可以立即开始工作。
但是,它变得不可靠:当进入新创建的项目时,用户开始看到挂起的导入作业,而且从未完成。第一个怀疑是导入父项目的用户权限不足,但即使是父项目所有者也报告无法将父项目导入新项目。
所以这是我的问题:还有其他方法可以将文件从模板项目克隆到新项目吗?是否有任何 hooks 或 cronjobs 在 Gitlab 服务器上独立运行?
【问题讨论】:
【参考方案1】:我设法将整个过程分为三个步骤:
-
创建新项目。
从现有项目存储库中获取所需文件。
将文件上传到新的项目存储库。
由于问题与技术无关,因此我将发布一些 javascript/Vue.js 风格的伪代码,为读者提供一般概述。
这是一个负责调用 Gitlab API 的函数:
async callGitLabProjects(url, method, payload, format)
const token = this.$store.getters.token
let headers
if (format === "text")
headers =
'Private-Token': token
else
headers =
'Content-Type': 'application/json',
'Private-Token': token
const response = await fetch(url,
method: method,
headers: headers,
body: JSON.stringify(payload)
)
return response.json()
可以通过调用 Gitlab API 来创建新项目,使用以下负载和指令:
const payload =
"name": "newProjectName",
"namespace_id": 10,
"description": "Description"
let newRepoUrl = ""
await this.callGitLabProjects("https://gitlab.expl.com/api/v4/projects/", "POST", payload, "json")
.then(data =>
newRepoUrl += data._links.self
.catch((e) =>
console.error(e)
)
如您所见,新的存储库 URL 已保存以供将来使用。
在第 2 步中,我们获取要导入的原始文件(请记住对文件名进行 URL 编码):
let rawFile = await this.callGitLabProjects("https://gitlab.expl.com/api/v4/projects/10705/repository/files/my%2Dfile%2Emd/raw?ref=master", "GET", "", "text")
获取后,您可以简单地将其上传到新项目的存储库:
const filePayload =
"branch": "master",
"content": rawFile,
"commit_message": "Initial file uploaded"
this.callGitLabProjects(newRepoUrl + "/repository/files/my%2Dfile%2Emd", "POST", filePayload, "json")
.catch((e) =>
console.log(e)
)
【讨论】:
以上是关于如何在不使用 import_url 的情况下将特定文件导入新创建的 Gitlab 项目?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不破坏我的结构的情况下将特定单元格排除到 BigQuery 中的数组数组中?
如何在不使用collect()和for循环的情况下将一个(IP地址)的特定部分与RDD python pyspark中另一列中的其他IP地址进行比较
如何在不将您的应用设为默认消息应用的情况下将短信发送到 android 中的特定应用?