如何在 gitlab 存储库中下载单个文件夹或文件

Posted

技术标签:

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

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

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

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

git 克隆

【问题讨论】:

Is there any way to clone a git repository's sub-directory only?的可能重复 论坛主题:forum.gitlab.com/t/… 似乎没有办法从 Gitlab GUI 中做到这一点 - 似乎在 Github 中有更多支持 ***.com/questions/4604663/… 【参考方案1】:

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

下载存储库中目录的存档

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

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

来自issue 24704:见documentation。


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

issue 28827 "通过 Repositories API 从存储库下载(子)文件夹", 已通过MR 71431 和commit 1b4e0a1 解决:
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”页面中并未以某种方式提及它。

【讨论】:

我们可以使用 curl 或 wget 下载吗? @Ashwani 还没有:后面是gitlab.com/gitlab-org/gitlab/issues/28827【参考方案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】:

Is there any way to clone a git repository's sub-directory only?

使用sparse checkout,从 1.7.0 版开始可用。

【讨论】:

注意它还会下载所有存储库历史内容。

以上是关于如何在 gitlab 存储库中下载单个文件夹或文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将存储库中的文件复制到用于作业的 Docker 容器中,在 gitlab-ci.yml

从GitHub下载单个文件

如何从 CLI 下载 GitHub 存储库中的子文件夹/文件

我的 Gitlab 存储库中的 Web 访问 HTML 文件

如何在GitLab存储库中删除Tag

从 GitLab 工件存档下载单个文件