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

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

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

这似乎还是有些过分。

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


当前回答

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

这也适用于目录。

其他回答

使用实例远程导出单个文件。

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

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

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

如果其他方启用了它,你可以使用git存档的'——remote=<URL>'选项(可能限制它到给定文件所在的目录),例如:

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

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

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

git show HEAD~4:index.html > local_file

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

如果没有其他答案工作(即限制GitLab访问),您可以通过以下方式进行“选择性签出”:

git clone—no-checkout—depth=1—no-tags URL git恢复——分级的DIR-OR-FILE git校验DIR-OR-FILE

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