从远程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
这似乎仍然过高。
从仓库中获取多个文件呢?
Answers:
在git版本1.7.9.5中,这似乎可以从远程导出单个文件
git archive --remote=ssh://host/pathto/repo.git HEAD README.md
这将处理文件的内容README.md
。
git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x
cat README.md
tar -xO
输出到STDOUT进行配管,例如FILE=README.md && git archive --remote=ssh://host/pathto/repo.git HEAD "$FILE" | tar -xO "$FILE"
紧接着雅各布的回答。 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托管的on Git存储库的使用,则需要启用daemon.uploadarch config选项。参见https://kernel.org/pub/software/scm/git/docs/git-daemon.html
如果有网页界面部署(如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 -
git config daemon.uploadarch true
在远程存储库上使用git-daemon(git://样式网址),则需要专门启用上载归档。默认情况下,git daemon禁用远程存档,并显示“严重:远程错误:访问被拒绝或存储库未导出:...”
git archive
方法是我的第一次尝试-但后来我注意到,tar
客户端计算机上的要求对于Windows用户而言并不十分方便。我们最终从本地cgit
服务器获取。它可以工作,但是速度却不如我希望的那样快(并且unix2dos
由于我们将带有Unix行尾的文件存储在Git存储库中,因此它仍然需要在Windows计算机上运行或类似)。
一般而言,但如果您使用的是Github,请执行以下操作:
对我来说wget
,原始网址是下载一个特定文件的最佳和最简便的方法。
在浏览器中打开文件,然后单击“原始”按钮。现在,刷新浏览器,复制该网址并做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
curl https://example.com/raw.txt > savedFile.txt
这似乎是我的解决方案:http : //gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html
git show HEAD~4:index.html > local_file
其中4
表示从现在开始有四个修订版本,~
是注释中提到的波浪号。
git show HEAD:./my_other_file > local_file
如果文件不在您的根目录中:)
我用这个
$ 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://raw.github.com/bk322/bk_automates/master/bkubuntu/bkubuntu.bash
ERROR: Certificate verification error for raw.github.com: unable to get local issuer certificate.
To connect to raw.github.com insecurely, use '--no-check-certificate'.
此处一些答案的细微差别,可以回答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
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
这也适用于目录。
对于单个文件,只需使用wget命令。
首先,按照下面的图片单击“原始”以获取URL,否则,您将下载嵌入html的代码。
然后,浏览器将打开一个以https://raw.githubusercontent.com/开头的URL的新页面。
只需在终端中输入命令:
#wget https://raw.githubusercontent.com/...
一段时间后,文件将放入您的文件夹中。
如果您的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
如果您不介意克隆整个目录,则此小bash / zsh函数的最终结果是将单个文件克隆到当前目录中(将存储库克隆到temp目录中,然后再将其删除)。
优点:您只会得到想要的文件
缺点:您仍然必须等待整个存储库克隆
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
}
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}"
GITHUB_PERSONAL_ACCESS_TOKEN
?
如果您的目标只是下载文件,那么有一个简单的应用程序,名为gget
:
gget github.com/gohugoio/hugo 'hugo_extended_*_Linux-ARM.deb'
上面的示例将从hugo
存储库下载单个文件。
与@Steven Penny的答案有关,我也使用wget。此外,要确定将输出发送到哪个文件,请使用-O。
如果您使用gitlabs,则网址的另一种可能性是:
wget "https://git.labs.your-server/your-repo/raw/master/<path-to-file>" -O <output-file>
除非您拥有证书或从受信任的服务器访问gitlabs安装,否则需要--no-check-certificate,如@Kos所述。我更喜欢这样做,而不是修改.wgetrc,但这取决于您的需求。
如果文件很大,则可以考虑在wget中使用-c选项。如果先前的意图在中间失败,则能够从您离开的位置继续下载文件。