如何在不使用 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 中的特定应用?

如何在不使用画布的情况下将整个 div 数据转换为图像并将其保存到目录中?

在不滚动的情况下将 ViewPager2 打开到特定位置

C#如何在不知道新数组长度的情况下将数组中的值保存到新数组中