从远程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

其他回答

如果你想从一个特定的散列+远程存储库中获取一个文件,我尝试过git-archive,但它不起作用。

你必须使用git克隆,一旦存储库克隆出来,你就必须使用git-archive来让它工作。

我发布了一个关于如何从远程的特定哈希在git存档中更简单地做到这一点的问题

我使用curl,它与公共回购或通过web界面使用https基本身份验证的人一起工作。

curl -L——retry 20——retry-delay 2 -O https://github.com/ACCOUNT/REPO/raw/master/PATH/TO/FILE/FILE.TXT -u USER:PASSWORD

我在github和bitbucket上进行了测试,两者都适用。

如果有web界面部署(如gitweb, cgit, Gitorious, ginatra),你可以使用它来下载单个文件('raw'或'plain'视图)。

如果其他方启用了它,你可以使用git存档的'——remote=<URL>'选项(可能限制它到给定文件所在的目录),例如:

$ git archive --remote=git@github.com:foo/bar.git --prefix=path/to/ HEAD:path/to/ |  tar xvf -

一般来说不是,但如果你使用Github:

对我来说,wget到原始url是下载一个特定文件的最佳和最简单的方法。

在浏览器中打开文件,点击“Raw”按钮。现在刷新浏览器,复制url并对其执行wget或curl操作。

wget的例子:

wget 'https://github.abc.abc.com/raw/abc/folder1/master/folder2/myfile.py?token=DDDDnkl92Kw8829jhXXoxBaVJIYW-h7zks5Vy9I-wA%3D%3D' -O myfile.py

旋度的例子:

curl 'https://example.com/raw.txt' > savedFile.txt

使用实例远程导出单个文件。

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

可以在命令末尾提供多个路径。