【问题标题】:how to download single folder OR file in gitlab repository如何在 gitlab 存储库中下载单个文件夹或文件
【发布时间】:2016-10-29 02:26:09
【问题描述】:

我有一个存储库。在此存储库中,有多个文件夹可用。

我只需要此存储库中的一个文件夹。

我已经尝试执行命令,但它不起作用。

git 克隆

【问题讨论】:

标签: git copy repository clone gitlab


【解决方案1】:

如果仅对该文件夹的内容感兴趣(而不是其历史记录),则可以,因为 GitLab 1.11(2019 年 5 月)只下载一个文件夹。

下载存储库中目录的存档

根据项目的类型及其大小,下载整个项目的存档可能会很慢或没有帮助——尤其是在大型 monorepos 的情况下。

在 GitLab 11.11 中,您现在可以下载当前目录(包括子目录)内容的存档,以便只下载您需要的文件

来自issue 24704:见documentation


使用 GitLab 14.4(2021 年 10 月),您可以:

curl --header "PRIVATE-TOKEN: <your_access_token>" \
"https://gitlab.com/api/v4/projects/<project_id>/repository/archive?sha=<commit_sha>&path=<path>"

但在“GitLab 1.44 released”页面中并未以某种方式提及它。

【讨论】:

【解决方案2】:

本机支持从 Gitlab 14.4 下载文件夹。见doc

例子:

https://<GITLAB-URL>/api/v4/projects/<project-id>/repository/archive?path=<subfolder-path>

【讨论】:

  • 好收获。赞成。我在my own answer 中引用了此功能。
【解决方案3】:

感谢Lzydorr。我需要在 Powershell 中使用它来获取 maven 项目中的版本。此功能下载 pom.xml 并找到“版本”标签。我把它贴在这里,以防其他任何人在 PS 中需要它。

这个函数可以这样调用:

$version = gitlabFetchVersion "integration/$appname" "master"

function gitlabFetchVersion {
  Add-Type -AssemblyName System.Web
  #$project = "integration/ssys-integration"
  $project = $($args[0])
  $project_enc = [System.Web.HTTPUtility]::UrlEncode($project)
  $file="pom.xml"
  $branch=$($args[1])
  $GITLAB_API_URL="https://git.infosynergi.no/api/v4"
  $GITLAB_TOKEN="XXXXXXX"
  $file_enc=[System.Web.HTTPUtility]::UrlEncode($file)
  $headers = @{
    Authorization = $GITLAB_TOKEN
    Accept        = "application/json"
  }

  $url = $GITLAB_API_URL + "/projects/" + $project_enc + "/repository/files/" + $file_enc + "?ref="+$branch
  $pom64 = Invoke-RestMethod -Method Get -Headers @{ 'PRIVATE-TOKEN'='qPxLx5Hk5cB4HLgbVDsQ' } -Uri $url
  $xml = [xml]([System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($pom64.content)))
  $pversion = $xml.project.version
  Write-Host "Version: " $pversion   
  return $pversion

}

【讨论】:

    【解决方案4】:

    这是一段(远非完美)sh 代码,用于使用我编写的 GiLab'a API 从 repo 获取文件或整个目录。如果你觉得它有用,请尽情享受:)

    #!/bin/sh
    
    GITLAB_API_URL=https://gitlab.com/api/v4
    GITLAB_TOKEN=<YOUR TOKEN>
    PROJECT=path/to/gitlab/project
    
    PROJECT_ENC=$(echo -n ${PROJECT} | jq -sRr @uri)
    
    function fetchFile() {
      FILE=$1
      FILE_ENC=$(echo -n ${FILE} | jq -sRr @uri)
    
      curl -s --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" "${GITLAB_API_URL}/projects/${PROJECT_ENC}/repository/files/${FILE_ENC}?ref=master" -o /tmp/file.info
      if [ "$(dirname $FILE)" != "." ]; then
        mkdir -p $(dirname $FILE)
      fi
      cat /tmp/file.info | jq -r '.content' | tr -d "\n" | jq -sRr '@base64d' > $FILE
      rm /tmp/file.info
    }
    
    function fetchDir() {
      DIR=$1
      FILES=$(curl -s --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" "${GITLAB_API_URL}/projects/${PROJECT_ENC}/repository/tree?ref=master&per_page=100&recursive=true&path=${DIR}" | jq -r '.[] | select(.type == "blob") | .path')
      for FILE in $FILES; do
        fetchFile $FILE
      done
    }
    
    fetchDir <REPO_DIR_TO_FETCH>
    

    它使用 curl 和 jq(至少 1.6 版本)。

    如果一个目录中可能有超过 100 个文件,请小心,因为上面的 fetchDir 函数只能获取 100 个文件。为了让它始终工作,你应该在那里添加一些循环。

    【讨论】:

      【解决方案5】:

      【讨论】:

      • 注意它还会下载所有存储库历史内容。
      猜你喜欢
      • 1970-01-01
      • 2021-11-02
      • 2020-04-21
      • 2021-04-15
      • 2022-01-09
      • 1970-01-01
      • 2019-07-14
      • 2017-08-17
      • 2021-08-26
      相关资源
      最近更新 更多