从存储库中检索单个文件
什么是最有效的机制(就传输的数据和磁盘空间而言)从远程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,并做一个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示例:
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选项。 如果以前的意图在中间失败,可以继续从离开的位置下载文件。