【问题标题】: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>
【解决方案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 个文件。为了让它始终工作,你应该在那里添加一些循环。