从存储库中检索单个文件

时间:2009-07-14 13:42:49

标签: git git-checkout

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

到目前为止,我已经设法提出:

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

这似乎有点矫枉过正。

如何从回购中获取多个文件?

23 个答案:

答案 0 :(得分:130)

在git版本1.7.9.5中,这似乎可以从远程

导出单个文件
git archive --remote=ssh://host/pathto/repo.git HEAD README.md

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

答案 1 :(得分:55)

继续Jakubanswergit archive生成tar或zip存档,因此您需要通过tar管道输出以获取文件内容:

git archive --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -x

将从当前目录中的远程存储库的HEAD保存“filename”的副本。

:path/to/directory部分是可选的。如果排除,则提取的文件将保存到<current working dir>/path/to/directory/filename

此外,如果要在git-daemon托管的Git存储库上启用git archive --remote,则需要启用daemon.uploadarch配置选项。见https://kernel.org/pub/software/scm/git/docs/git-daemon.html

答案 2 :(得分:41)

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

如果其他方启用了,您可以使用 git archive 的'--remote=<URL>'选项(并可能将其限制在给定的目录中文件驻留在)中,例如:

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

答案 3 :(得分:24)

不是一般情况,但如果您使用的是Github:

对我来说,原始网址wget被证明是下载某个特定文件的最佳和最简单的方式。

在浏览器中打开文件,然后点击&#34; Raw&#34;按钮。现在刷新浏览器,复制网址并在其上执行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 'https://example.com/raw.txt' > savedFile.txt

答案 4 :(得分:11)

从远程导出单个文件:

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

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

答案 5 :(得分:8)

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

git show HEAD~4:index.html&gt; LOCAL_FILE

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

答案 6 :(得分:6)

我用这个

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

答案 7 :(得分:3)

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

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

答案 8 :(得分:2)

在我看来,使用以下内容最简单的方法:

wget https://github.com/name/folder/file.zip?raw=true

答案 9 :(得分:2)

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

答案 10 :(得分:1)

Yisrael Dov's answer是直截了当的,但它不允许压缩。您可以使用--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

这也适用于目录。

答案 11 :(得分:1)

我以这种方式解决了

git archive --remote=ssh://git@gitlab.com/user/mi-repo.git BranchName /path-to-file/file_name | tar -xO /path-to-file/file_name > /path-to-save-the-file/file_name

如果需要,可以将“ BranchName”替换为“ HEAD”

答案 12 :(得分:1)

如果您的Git存储库托管在Azure-DevOps(VSTS)上,则可以使用Rest API检索单个文件。

此API的格式如下:

 https://dev.azure.com/{organization}/_apis/git/repositories/{repositoryId}/items?path={pathToFile}&api-version=4.1?download=true

例如:

 https://dev.azure.com/{organization}/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items?scopePath=/MyWebSite/MyWebSite/Views/Home/_Home.cshtml&download=true&api-version=4.1

答案 13 :(得分:1)

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

首先,按照下面的图片点击“raw”获取网址,否则你将下载嵌入在html中的代码。 enter image description here

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

开头

只需在终端输入命令:

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

文件将放入您的文件夹中。

答案 14 :(得分:0)

如果您的目标只是下载文件,则有一个名为gget的无忧应用程序:

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

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

https://github.com/dpb587/gget

答案 15 :(得分:0)

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

  1. git clone --no-checkout --depth=1 --no-tags URL
  2. git restore --staged DIR-OR-FILE
  3. git checkout DIR-OR-FILE

尽管此解决方案 100% 符合 git 并且您可以检出目录,但它不是对文件执行 wget/curl 的磁盘或网络优化。

答案 16 :(得分:0)

以下2条命令对我有用:

file_to_download

从URL为tar的远程存储库的branch下载remote_repo_git_url作为tar_out_file存档并将其存储在tar -x -f {tar_out_file}.tar

file_to_downloadtar_out_file提取{{1}}

答案 17 :(得分:0)

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

答案 18 :(得分:0)

如果您不介意克隆整个目录,则此bash / zsh小功能的最终结果是将单个文件克隆到当前目录中(通过将存储库克隆到temp目录中,然后将其删除)。 / p>

专业人士:您只会得到想要的文件

缺点:您仍然必须等待整个回购克隆

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
}

答案 19 :(得分:0)

直接从浏览器(我使用野生动物园...)获取位桶,右键单击“查看原始文件”,然后选择“下载链接的文件”:

enter image description here

答案 20 :(得分:0)

如果你想从特定的哈希+远程存储库中获取文件,我已经尝试过git-archive,但它没有用。

您必须使用git clone,一旦克隆了存储库,您就可以使用git-archive使其正常工作。

我在git archive from a specific hash from remote

中发布了一个关于如何更简单地执行此操作的问题

答案 21 :(得分:0)

我使用curl,它适用于公共存储库或通过Web界面使用https基本身份验证的那些。

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上测试了它,适用于两者。

答案 22 :(得分:-1)

与@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选项。如果之前的意图在中间失败,则能够从您离开的位置继续下载文件。