从存储库检索单个文件


220

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

到目前为止,我已经设法提出了:

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

这似乎仍然过高。

从仓库中获取多个文件呢?


3
aw 如果有一种内置的方式可以实现“ cat-remote”和“ tag-remote”的功能,我将非常喜欢。
康妮

3
我有同样的问题,我想在2个仓库中拥有相同的许可证文件;在1个存储库中编辑文件,然后使其自动更新另一个存储库中的副本。
GlassGhost 2011年

Answers:


143

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

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

这将处理文件的内容README.md


27
...除非它在GitHub上不起作用。ang :( twitter.com/GitHubHelp/status/322818593748303873
Rob Howard

13
这似乎不产生原始文件,而是仅包含一个文件的tar文件。
Frerich Raabe 2014年

20
@FrerichRaabe只需添加`| tar -x`命令。 git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x cat README.md
renier

12
您可以使用tar -xO输出到STDOUT进行配管,例如FILE=README.md && git archive --remote=ssh://host/pathto/repo.git HEAD "$FILE" | tar -xO "$FILE"
paulcm

2
正是我在寻找的答案,但是我得到了“致命的:协议不支持该操作”。来自Git的回应。啊
mhvelplund '16

68

紧接着雅各布回答git archive生成tar或zip归档文件,因此您需要通过tar将输出通过管道传输以获取文件内容:

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

从远程存储库的HEAD中将“文件名”的副本保存在当前目录中。

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

另外,如果要启用git archive --remotegit-daemon托管的on Git存储库的使用,则需要启用daemon.uploadarch config选项。参见https://kernel.org/pub/software/scm/git/docs/git-daemon.html


2
如果它是一个文本文件,我们希望将其保存到另一部分,则可以使用:tar -xO>〜/ destfile.ext
yucer

44

如果有网页界面部署(如gitweb,cgit,Gitorious,ginatra),则可以使用它来下载单个文件(“原始”或“纯文本”视图)。

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

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

注意:该示例未经测试!
JakubNarębski09年

7
对于您自己的存储库,如果git config daemon.uploadarch true在远程存储库上使用git-daemon(git://样式网址),则需要专门启用上载归档。默认情况下,git daemon禁用远程存档,并显示“严重:远程错误:访问被拒绝或存储库未导出:...”
patthoyts 2013年

+1该git archive方法是我的第一次尝试-但后来我注意到,tar客户端计算机上的要求对于Windows用户而言并不十分方便。我们最终从本地cgit服务器获取。它可以工作,但是速度却不如我希望的那样快(并且unix2dos由于我们将带有Unix行尾的文件存储在Git存储库中,因此它仍然需要在Windows计算机上运行或类似)。
Frerich Raabe 2014年

1
@FrerichRaabe使用-o fetched.zip。另请参见--format = <fmt>选项。
akhan 2014年

5
就其价值而言,它似乎不适用于GitHub托管存储库。请参阅help.github.com/articles/can-i-archive-a-repositorygroups.google.com/forum/#!topic/github/z8vLHcX0HxY
vmrob 2014年

30

一般而言,但如果您使用的是Github,请执行以下操作:

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

在浏览器中打开文件,然后单击“原始”按钮。现在,刷新浏览器,复制该网址并做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


3
这是最简单的解决方案,适用于任何可能找到的原始txt。 curl https://example.com/raw.txt > savedFile.txt
JacobPariseau

wget示例不起作用,但是curl示例却起作用。
凯尔·贝克

对我来说很好。您是否在命令行上将URL放在引号中?
Ankur Agarwal

这不会保留git的历史记录
crypdick

15

要从远程导出单个文件:

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

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


9

这似乎是我的解决方案:http : //gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html

git show HEAD~4:index.html > local_file

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


请务必注意,它不是“ HEAD”和“ 4”之间的“减号”“-”,而是“代字号”“〜”。显然,我对git文档的阅读不够好,或者我的眼镜需要更新;-)
丹尼斯

18
像OP一样,这似乎并没有从远程存储库中获取文件。
Mike Weller 2013年

或者:git show HEAD:./my_other_file > local_file如果文件不在您的根目录中:)
kenorb

1
对所有拒绝投票者的要求-请解释并澄清不正确的地方-我们在这里学习和分享:)
火星罗伯逊

9
@MichalStefanow:Mike Weller拥有它;特别是,这不适用于远程存储库。即使您随后在上面设置了远程服务器,也至少需要一个本地克隆。
Rob Howard

6

我用这个

$ 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'

即使没有wgetrc调整也可以为我工作:wget https://raw.github.com/bk322/bk_automates/master/bkubuntu/bkubuntu.bash
Adobe

1
我的讯息对您有帮助:ERROR: Certificate verification error for raw.github.com: unable to get local issuer certificate. To connect to raw.github.com insecurely, use '--no-check-certificate'.
Kos

3
这仅适用于公共存储库。对于私有存储库,您需要身份验证。
里卡多·奥特罗

5

此处一些答案的细微差别,可以回答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

这不起作用,github不支持git归档。
菲利普·弗伦克

2
Err .. git不仅用于GitHub
Willem van Ketwich,

1
您在答案中明确将--remote设置为github URL ;-)
Philipp Flenker

1
感谢您的反馈。相应地修改了答案。
Willem van Ketwich

2

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

2

我以这种方式解决了:

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”


2

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

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

1

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

这也适用于目录。


1

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

首先,按照下面的图片单击“原始”以获取URL,否则,您将下载嵌入html的代码。 在此处输入图片说明

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

只需在终端中输入命令:

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

一段时间后,文件将放入您的文件夹中。


是的,这在具有REST功能的Python或其他编程语言中也很好用。例如,对于从不同的存储库下载模块..
拉斯GJ

1

如果您的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

它需要api令牌,不是吗?
尤里·波兹尼亚克

取决于您如何运行api
Shayki Abramczyk,

0

我使用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上对其进行了测试,两者均可工作。


0

如果您想从特定的哈希+远程存储库中获取文件,我已经尝试过git-archive,但是它不起作用。

您将不得不使用git clone,一旦克隆了存储库,您就必须使用git-archive使其正常工作。

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


0

直接从浏览器(我使用野生动物园...)获取位桶,右键单击“查看原始文件”,然后选择“下载链接的文件”:

在此处输入图片说明


0

如果您不介意克隆整个目录,则此小bash / zsh函数的最终结果是将单个文件克隆到当前目录中(将存储库克隆到temp目录中,然后再将其删除)。

优点:您只会得到想要的文件

缺点:您仍然必须等待整个存储库克隆

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
}

此答案可能有助于进行稀疏克隆,这没有开销。
Yuriy Pozniak

0

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}"

我们在哪里找到GITHUB_PERSONAL_ACCESS_TOKEN
ShadSterling

1
您可以通过转到https:// <您的github-server> / settings / tokens并单击“生成新令牌”按钮来创建个人访问令牌。
奥利弗·皮尔曼

嗯,我们有自动的用户名和密码,用于对使用同一SSO的多个系统进行身份验证,因此我希望找到一种自动生成给定用户名和密码的令牌的方法。
ShadSterling

0

如果您的目标只是下载文件,那么有一个简单的应用程序,名为gget

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

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

https://github.com/dpb587/gget


-1

与@Steven Penny的答案有关,我也使用wget。此外,要确定将输出发送到哪个文件,请使用-O。

如果您使用gitlabs,则网址的另一种可能性是:

wget "https://git.labs.your-server/your-repo/raw/master/<path-to-file>" -O <output-file>

除非您拥有证书或从受信任的服务器访问gitlabs安装,否则需要--no-check-certificate,如@Kos所述。我更喜欢这样做,而不是修改.wgetrc,但这取决于您的需求。

如果文件很大,则可以考虑在wget中使用-c选项。如果先前的意图在中间失败,则能够从您离开的位置继续下载文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.