从存储库中检索单个文件

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

到目前为止,我设法想出了:

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

这似乎还是矫枉过正。

怎么从回购多个文件?

在git 1.7.9.5版本,这似乎工作从远程导出单个文件

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

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

如果有部署的Web界面 (如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 - 

继续Jakub的回答 。 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

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

对我来说,原始url原来是最好的,最简单的方式来下载一个特定的文件。

在浏览器中打开文件,然后点击“原始”button。 现在刷新你的浏览器,复制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示例:

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

它看起来像我的解决scheme: http : //gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html

git show HEAD〜4:index.html> local_file

其中4表示从现在开始的四次修订,并且~是在评论中提到的代字符。

从远程输出单个文件:

 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 

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

我用这个

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

这里回答OP的问题的一些答案的细微变体:

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

以色列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 

这也适用于目录。

我使用curl,它使用公共回购或通过Web界面使用https基本身份validation。

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上testing过了,两者都适用。

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

你将不得不使用git clone,一旦存储库被克隆,你就可以使用git-archive使它工作。

我发布了一个关于如何在远程的特定散列的git存档中更简单的问题

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

首先,按照下面的图片点击“原始”来获取url,否则您将下载embedded在HTML中的代码。 在这里输入图像描述

然后,浏览器将打开一个新的网页与url开始https://raw.githubusercontent.com/

只需在terminalinput命令:

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

一会儿文件将放入您的文件夹。

关于@Steven Penny的回答,我也使用wget。 此外,要决定哪个文件发送输出到我使用-O。

如果你使用的是gitlabs,那么url的另一种可能性是:

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

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

如果这是一个很大的文件,你可能会考虑在wget中使用-c选项。 如果以前的意图在中间失败,可以继续从离开的位置下载文件。