从远程 git 存储库获取单个文件的内容的最有效机制(关于传输的数据和使用的磁盘空间)是什么?
到目前为止,我已经设法提出:
git clone --no-checkout --depth 1 git@github.com:foo/bar.git && cd bar && git show HEAD:path/to/file.txt
这似乎仍然是矫枉过正。
从 repo 中获取多个文件怎么样?
从远程 git 存储库获取单个文件的内容的最有效机制(关于传输的数据和使用的磁盘空间)是什么?
到目前为止,我已经设法提出:
git clone --no-checkout --depth 1 git@github.com:foo/bar.git && cd bar && git show HEAD:path/to/file.txt
这似乎仍然是矫枉过正。
从 repo 中获取多个文件怎么样?
在 git 版本 1.7.9.5 中,这似乎可以从远程导出单个文件
git archive --remote=ssh://host/pathto/repo.git HEAD README.md
这将 cat 文件的内容README.md
。
继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
此外,如果您想启用git archive --remote
在 git-daemon 托管的 Git 存储库上的使用,您需要启用 daemon.uploadarch 配置选项。见https://kernel.org/pub/software/scm/git/docs/git-daemon.html
如果部署了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 -
不是一般情况,但如果您使用的是 Github:
对我来说wget
,原始 url 被证明是下载特定文件的最佳和最简单的方法。
在浏览器中打开文件,然后单击“Raw”按钮。现在刷新您的浏览器,复制网址并在其上执行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 'https://example.com/raw.txt' > savedFile.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
您可以在命令末尾提供多个路径。
这对我来说似乎是一个解决方案:http: //gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html
git show HEAD~4:index.html > local_file
where4
表示从现在开始的四次修订,并且~
是评论中提到的代字号。
我用这个
$ 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'
在我看来,使用以下内容的最简单方法:
wget https://github.com/name/folder/file.zip?raw=true
这里的一些答案的细微差别回答了 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
如果没有其他答案有效(即限制性 GitLab 访问),您可以通过以下方式进行“选择性结帐”:
git clone --no-checkout --depth=1 --no-tags URL
git restore --staged DIR-OR-FILE
git checkout DIR-OR-FILE
尽管此解决方案 100% 兼容 git,并且您可以签出目录,但它不是磁盘或网络最佳的文件,因为对文件执行 wget/curl。
我是这样解决的:
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”
如果您的存储库支持令牌(例如 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
对于单个文件,只需使用 wget 命令。
首先,按照下图点击“raw”获取url,否则会下载嵌入html的代码。
然后,浏览器将打开一个新页面,其 url 以https://raw.githubusercontent.com/开头...
只需在终端输入命令:
#wget https://raw.githubusercontent.com/...
一会儿文件就会放到你的文件夹里。
这是特定于托管在GitHub 上的 git repos
尝试使用 Github 命令行应用程序的“api”命令,对 Github 的“获取存储库内容”端点gh
进行经过身份验证的调用。
基本命令是:
$gh api /repos/{owner}/{repo}/contents/<path_to_the_file>
作为额外的奖励,当您从包含您尝试从中获取文件的存储库的克隆的目录中执行此操作时,将自动填写 {owner} 和 {repo} 部分。
https://docs.github.com/en/rest/reference/repos#get-repository-content
响应将是一个 JSON 对象。如果 <path_to_the_file> 确实指向一个文件,则 JSON 将包含一个“大小”、“名称”、几个用于访问该文件的 url 字段,以及一个“内容”字段,它是文件的 base64 编码版本内容。
要获取文件内容,您可以卷曲“download_url”的值,或者只是解码“内容”字段。您可以通过管道传递 base64 命令来做到这一点,如下所示:
$gh api /repos/{owner}/{repo}/contents/<path-to-the-file> --jq '.content' | base64 -d
如果您的 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
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
这也适用于目录。
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}"
以下 2 个命令对我有用:
git archive --remote={remote_repo_git_url} {branch} {file_to_download} -o {tar_out_file}
从url 为的远程存储库file_to_download
下载存档tar
并将其存储在branch
remote_repo_git_url
tar_out_file
tar -x -f {tar_out_file}.tar
file_to_download
从中提取tar_out_file
我使用 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
I've tested it on github and bitbucket, works on both.
如果您的目标只是下载文件,那么有一个名为gget
:
gget github.com/gohugoio/hugo 'hugo_extended_*_Linux-ARM.deb'
上面的示例将从hugo
存储库下载单个文件。
如果您不介意克隆整个目录,这个小型 bash/zsh 函数的最终结果是将单个文件克隆到当前目录(通过将 repo 克隆到临时目录并随后将其删除)。
优点:你只得到你想要的文件
缺点:你仍然需要等待整个 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
}
如果您想从特定哈希 + 远程存储库中获取文件,我已经尝试过 git-archive 并且它不起作用。
您必须使用 git clone 并且一旦存储库被克隆,您就必须使用 git-archive 使其工作。
我发布了一个问题,关于如何在git 存档中从远程的特定哈希中更简单地做到这一点
与@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 选项。如果先前的意图在中间失败,则能够继续从您离开的位置下载文件。