从存储库检索单个文件

从远程git存储库获取单个文件内容的最有效机制(就传输的数据和使用的磁盘空间而言)是什么?

到目前为止,我已经想出了:

git clone --no-checkout --depth 1 git@github.com:foo/bar.git && cd bar && git show HEAD:path/to/file.txt

这似乎还是有些过分。

从回购中获取多个文件呢?

305790 次浏览

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

如果另一端是启用它,你可以使用git archive的'--remote=<URL>'选项(并可能将其限制为给定文件所在的目录),例如:

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

Jakub回答git archive生成tar或zip存档,所以你需要通过tar管道输出以获得文件内容:

git archive --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -x

将在当前目录中保存远程存储库HEAD中的'filename'的副本。

:path/to/directory是可选的。如果排除,则提取的文件将保存到<current working dir>/path/to/directory/filename

此外,如果你想在Git -daemon托管的Git存储库上启用git archive --remote,你需要启用守护进程。Uploadarch配置选项。看到https://kernel.org/pub/software/scm/git/docs/git-daemon.html

它看起来像一个解决方案,我:http://gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html

git show HEAD~4:index.html > local_file

其中4表示从现在开始的四次修订,~是注释中提到的波浪号。

我用这个

$ cat ~/.wgetrc
check_certificate = off


$ wget https://raw.github.com/jquery/jquery/master/grunt.js
HTTP request sent, awaiting response... 200 OK
Length: 11339 (11K) [text/plain]
Saving to: `grunt.js'

在git版本1.7.9.5中,这似乎可以从远程导出单个文件

git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar xO

这将包含文件README.md的内容。

关于@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选项。为了能够继续下载文件从你离开它,如果之前的意图失败在中间。

我使用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上进行了测试,两者都适用。

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

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

在浏览器中打开文件,点击"Raw"按钮。现在刷新浏览器,复制url并在其上执行wgetcurl

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

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

以色列多夫的回答是最简单的一个,但它不允许压缩。你可以使用--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

这也适用于目录。

这里有一些答案的微妙变化,回答了OP的问题:

git archive --remote=git@archive-accepting-git-server.com:foo/bar.git \
HEAD path/to/file.txt | tar -xO path/to/file.txt > file.txt

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

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

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

对于单个文件,只需使用wget命令。

首先,按照下面的图片点击“raw”来获得url,否则你将下载嵌入html中的代码。 enter image description here < / p >

然后,浏览器将打开一个url以https://raw.githubusercontent.com/开头的新页面…

只需在终端输入命令:

#wget https://raw.githubusercontent.com/...

一会儿文件就会放在你的文件夹里。

如果您的存储库支持令牌(例如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

直接从浏览器(我使用safari…)右键单击“查看原始”,选择“下载链接文件”:

enter image description here

如果你的Git存储库托管在Azure-DevOps (VSTS)上,你可以用Rest API检索单个文件。

这个API的格式是这样的:

 https://dev.azure.com/{organization}/_apis/git/repositories/{repositoryId}/items?path={pathToFile}&api-version=4.1?download=true

例如:

 https://dev.azure.com/{organization}/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items?scopePath=/MyWebSite/MyWebSite/Views/Home/_Home.cshtml&download=true&api-version=4.1

我是这样解决的:

git archive --remote=ssh://git@gitlab.com/user/mi-repo.git BranchName /path-to-file/file_name | tar -xO /path-to-file/file_name > /path-to-save-the-file/file_name

如果你愿意,你可以用"BranchName"代替"HEAD"

如果您不介意克隆整个目录,这个小bash/zsh函数的最终结果是将单个文件克隆到当前目录中(通过将repo克隆到临时目录中,然后删除它)。

正方:你只能得到你想要的文件

缺点:你仍然需要等待整个回购复制

git-single-file () {
if [ $# -lt 2 ]
then
echo "Usage: $0 <repo url> <file path>"
return
fi
TEMP_DIR=$(mktemp -d)
git clone $1 $TEMP_DIR
cp $TEMP_DIR/$2 .
rm -rf $TEMP_DIR
}

Github企业解决方案

HTTPS_DOMAIN=https://git.your-company.com
ORGANISATION=org
REPO_NAME=my-amazing-library
FILE_PATH=path/to/some/file
BRANCH=develop
GITHUB_PERSONAL_ACCESS_TOKEN=<your-access-token>


URL="${HTTPS_DOMAIN}/raw/${ORGANISATION}/${REPO_NAME}/${BRANCH}/${FILE_PATH}"


curl -H "Authorization: token ${GITHUB_PERSONAL_ACCESS_TOKEN}" ${URL} > "${FILE_PATH}"

在我看来,使用以下方法是最简单的:

wget https://github.com/name/folder/file.zip?raw=true

如果你的目标只是下载文件,有一个叫做gget的轻松应用程序:

gget github.com/gohugoio/hugo 'hugo_extended_*_Linux-ARM.deb'

上面的例子将从hugo存储库下载单个文件。

https://github.com/dpb587/gget

下面两个命令对我来说很有用:

git archive --remote={remote_repo_git_url} {branch} {file_to_download} -o {tar_out_file}

从url为remote_repo_git_url的远程存储库的branch下载file_to_download作为tar存档,并将其存储在tar_out_file

tar -x -f {tar_out_file}.tartar_out_file中提取file_to_download

如果没有其他答案有效(即限制GitLab访问),您可以执行“选择性签出”。由:

  1. git clone --no-checkout --depth=1 --no-tags URL
  2. git restore --staged DIR-OR-FILE
  3. git checkout DIR-OR-FILE

尽管这个解决方案100%兼容git,并且您可以签出目录,但与对文件执行wget/curl相比,它在磁盘和网络上都不是最优的。

这是特定于托管在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将包括“大小”,“名称”,几个访问文件的url字段,以及“内容”字段,这是文件内容的base64编码版本。

要获得文件内容,您可以卷曲“download_url”的值,或者只是解码“content”字段。你可以通过管道base64命令来做到这一点,就像这样:

$gh api /repos/{owner}/{repo}/contents/<path-to-the-file> --jq '.content' | base64 -d