我在Heroku上使用node.js(express),slug size is limited to 300MB。
为了保持我的小块,我想使用git-lfs跟踪我的快递' public
文件夹。
通过这种方式,我的所有资产(图像,视频......)都被上传到lfs-store(比如说AWS S3),git-lfs就会离开a pointer file(可能还有S3网址?)。
我希望在从公用文件夹提供文件时快速重定向到远程S3文件。
我的问题是我不知道如何从指针文件的内容中检索网址......
app.use('/public/:pointerfile', function (req, res, next) {
var file = req.params.pointerfile;
fs.readFile('public/'+file, function (er, data) {
if (er) return next(er);
var url = retrieveUrl(data); // <-- HELP ME HERE with the retrieveUrl function
res.redirect(url);
});
});
您认为快速阅读和解析所有public/*
文件并不会太昂贵。也许我可以在解析后缓存URL?
答案 0 :(得分:10)
实际上pointer
文件中不包含任何网址信息(可以在您提供的链接中看到,或here) - 它只保留oid
(对象) ID)对于blob来说就是sha256
。
然而,您可以使用oid
和lfs api来实现您的目标,这样您就可以使用batch request下载特定的oid
。
您可以确定用于存储来自.git/config
的blob的端点是什么,该端点可以接受非默认lfsurl
标记,例如:
[remote "origin"]
url = https://...
fetch = +refs/heads/*:refs/remotes/origin/*
lfsurl = "https://..."
或单独的
[lfs]
url = "https://..."
如果没有lfsurl
标签,那么您正在使用GitHub的端点(可能会重定向到S3):
Git remote: https://git-server.com/user/repo.git
Git LFS endpoint: https://git-server.com/user/repo.git/info/lfs
Git remote: git@git-server.com:user/repo.git
Git LFS endpoint: https://git-server.com/user/repo.git/info/lfs
但你应该反对它,而不是直接使用S3,因为GitHub的重定向响应可能也会包含一些身份验证信息。
检查batch response doc以查看响应结构 - 您基本上需要解析相关部分并自行调用以检索blob(这是git lfs
将在您的在结账时代替。)
典型的回答(取自我引用的文档)看起来像:
{
"_links": {
"download": {
"href": "https://storage-server.com/OID",
"header": {
"Authorization": "Basic ...",
}
}
}
}
所以你会GET
https://storage-server.com/OID
与批量响应中返回的headers
- 最后一步是重命名返回的blob(它的名字通常只是oid
因为git lfs使用基于校验和的存储) - 指针文件具有原始资源的名称,所以只需将blob重命名为。
答案 1 :(得分:0)
我终于为此制作了一个中间件: express-lfs ,其中有一个演示:https://expresslfs.herokuapp.com
您可以下载400Mo文件作为证明。
请参阅此处的用法:https://github.com/goodenough/express-lfs#usage
PS:感谢@fundeldman在his answer;)
中提出的建议