如何在 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
如何从 CLI 下载 GitHub 存储库中的子文件夹/文件