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

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

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

这似乎还是有些过分。

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


当前回答

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

其他回答

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

首先,按照下面的图片点击“raw”来获取url,否则你将下载嵌入html中的代码。

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

只需在终端输入命令:

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

一会儿文件就会放在你的文件夹里。

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

这也适用于目录。

如果你的目标只是下载文件,有一个叫gget的轻松应用程序:

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

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

https://github.com/dpb587/gget

如果您不介意克隆整个目录,这个小bash/zsh函数的最终结果是将单个文件克隆到当前目录中(通过将repo克隆到临时目录中,然后删除它)。

正方:你只能得到你想要的文件

缺点:你仍然需要等待整个回购复制

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
}

关于@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选项。为了能够继续下载文件从你离开它,如果之前的意图失败在中间。