从远程git存储库获取单个文件内容的最有效机制(就传输的数据和使用的磁盘空间而言)是什么?
到目前为止,我已经想出了:
git clone --no-checkout --depth 1 git@github.com:foo/bar.git && cd bar && git show HEAD:path/to/file.txt
这似乎还是有些过分。
从回购中获取多个文件呢?
从远程git存储库获取单个文件内容的最有效机制(就传输的数据和使用的磁盘空间而言)是什么?
到目前为止,我已经想出了:
git clone --no-checkout --depth 1 git@github.com:foo/bar.git && cd bar && git show HEAD:path/to/file.txt
这似乎还是有些过分。
从回购中获取多个文件呢?
当前回答
这是特定于托管在GitHub上的git回购
尝试Github的命令行应用程序gh的“api”命令,对Github的“获取存储库内容”端点进行身份验证调用。
基本命令是:
$gh api /repos/{owner}/{repo}/contents/<path_to_the_file>
作为额外的奖励,当您从包含您试图从中获取文件的repo副本的目录中执行此操作时,{owner}和{repo}部分将自动填充。
https://docs.github.com/en/rest/reference/repos#get-repository-content
响应将是一个JSON对象。如果<path_to_the_file>确实指向一个文件,JSON将包括一个'size', 'name',几个访问文件的url字段,以及一个'content'字段,这是文件内容的base64编码版本。
要获得文件内容,你可以卷曲“download_url”的值,或者只是解码“content”字段。你可以通过管道base64命令来做到这一点,就像这样:
$gh api /repos/{owner}/{repo}/contents/<path-to-the-file> --jq '.content' | base64 -d
其他回答
Yisrael Dov的答案很简单,但它不允许压缩。您可以使用——format=zip,但不能像使用tar一样使用管道命令直接解压缩,因此需要将其保存为临时文件。这是一个脚本:
#!/bin/bash
BASENAME=$0
function usage {
echo "usage: $BASENAME <remote-repo> <file> ..."
exit 1
}
[ 2 -gt "$#" ] && { usage; }
REPO=$1
shift
FILES=$@
TMPFILE=`mktemp`.zip
git archive -9 --remote=$REPO HEAD $FILES -o $TMPFILE
unzip $TMPFILE
rm $TMPFILE
这也适用于目录。
使用实例远程导出单个文件。
git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x
这将下载文件README。Md到当前目录。
如果你想把文件的内容导出到STDOUT:
git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -xO
可以在命令末尾提供多个路径。
下面两个命令对我来说很有用:
Git存档——remote={remote_repo_git_url} {branch} {file_to_download} -o {tar_out_file}
从远程存储库的分支(url为remote_repo_git_url)下载file_to_download作为tar归档文件,并存储在tar_out_file中
Tar -x -f {tar_out_file}.tar从tar_out_file中提取file_to_download文件
关于@Steven Penny的回答,我也使用wget。此外,为了决定将输出发送到哪个文件,我使用了-O。
如果你正在使用gitlabs, url的另一种可能是:
wget "https://git.labs.your-server/your-repo/raw/master/<path-to-file>" -O <output-file>
除非您有证书,或者从受信任的服务器访问所需的gitlabs安装——如@Kos所说,无需检查证书。我更喜欢这样,而不是修改。wgetrc,但这取决于你的需要。
如果它是一个大文件,你可以考虑在wget中使用-c选项。为了能够继续下载文件从你离开它,如果之前的意图失败在中间。
如果您的存储库支持令牌(例如GitLab),那么为您的用户生成一个令牌,然后导航到您将下载的文件,并单击RAW输出以获得URL。下载文件使用:
curl --silent --request GET --header 'PRIVATE-TOKEN: replace_with_your_token' \
'http://git.example.com/foo/bar.sql' --output /tmp/bar.sql