【问题标题】:How to import a specific file to a newly created Gitlab project without using import_url?如何在不使用 import_url 的情况下将特定文件导入新创建的 Gitlab 项目?
【发布时间】: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 服务器上独立运行?

【问题讨论】:

    标签: gitlab gitlab-api


    【解决方案1】:

    我设法将整个过程分为三个步骤:

    1. 创建新项目。
    2. 从现有项目存储库中获取所需文件。
    3. 将文件上传到新的项目存储库。

    由于问题与技术无关,因此我将发布一些 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)
            })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      相关资源
      最近更新 更多