从远程git存储库获取单个文件内容的最有效机制(就传输的数据和使用的磁盘空间而言)是什么?
到目前为止,我已经想出了:
git clone --no-checkout --depth 1 git@github.com:foo/bar.git && cd bar && git show HEAD:path/to/file.txt
这似乎还是有些过分。
从回购中获取多个文件呢?
从远程git存储库获取单个文件内容的最有效机制(就传输的数据和使用的磁盘空间而言)是什么?
到目前为止,我已经想出了:
git clone --no-checkout --depth 1 git@github.com:foo/bar.git && cd bar && git show HEAD:path/to/file.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
可以在命令末尾提供多个路径。
其他回答
关于@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选项。为了能够继续下载文件从你离开它,如果之前的意图失败在中间。
在我看来,使用以下方法是最简单的:
wget https://github.com/name/folder/file.zip?raw=true
下面是Jakub的回答。Git存档生成tar或zip存档,所以你需要通过tar管道输出以获得文件内容:
git archive --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -x
将在当前目录中保存远程存储库HEAD中的'filename'的副本。
:path/to/directory部分是可选的。如果排除,提取的文件将保存到<当前工作目录>/path/to/directory/filename
此外,如果你想在git-daemon托管的git存储库上启用git archive——remote,你需要启用守护进程。Uploadarch配置选项。参见https://kernel.org/pub/software/scm/git/docs/git-daemon.html
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
这也适用于目录。
如果您的存储库支持令牌(例如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