从express'提供git-lfs文件公用文件夹

时间:2016-04-27 22:58:21

标签: express heroku amazon-s3 git-lfs

我在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?

2 个答案:

答案 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;)

中提出的建议