2016-04-27 53 views
8

我在Heroku上使用node.js(express),其中slug size is limited to 300MB从快递公共文件夹服务git-lfs文件

为了让我的slu small变小,我想用git-lfs来跟踪我的快递'public文件夹。

这样,我的所有资产(图片,视频......)都上传到一个lfs-store(比如AWS S3),git-lfs离开a pointer file(可能包含S3 URL)。

我想在从公用文件夹提供文件时将重定向转发到远程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分析一次?

回答

10

其实pointer文件不包含任何URL信息(如可以在链接中可以看出你提供,或here) - 它只是不断BLOB的oid(对象ID),这仅仅是它的sha256

但是,您可以实现你在找什么用oid并允许您使用batch request下载特定oid S上的LFS api

你可以告诉什么是所使用你的斑点从.git/config存储可以接受非默认lfsurl标记,如终点:

[remote "origin"] 
    url = https://... 
    fetch = +refs/heads/*:refs/remotes/origin/* 
    lfsurl = "https://..." 

或单独

[lfs] 
    url = "https://..." 

如果没有lfsurl tag然后你使用的是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: [email protected]:user/repo.git 
Git LFS endpoint: https://git-server.com/user/repo.git/info/lfs 

但是你应该直接针对它而不是S3,因为GitHub的重定向响应也可能包含一些认证信息。

检查batch response文档以查看响应结构 - 您将基本上需要解析相关部分并自行调用以检索blob(这是git lfs在结帐时用来代替的方式)。

典型的响应(从我所引用的文档拍摄)看起来是这样的:

{ 
    "_links": { 
    "download": { 
     "href": "https://storage-server.com/OID", 
     "header": { 
     "Authorization": "Basic ...", 
     } 
    } 
    } 
} 

所以,你会用什么headers从批量应答返回GEThttps://storage-server.com/OID - 最后一步将是重命名返回的blob(它的名字通常只是oid,因为git lfs使用基于校验码的存储) - 指针文件具有原始资源的名称,因此只需将blob重命名为该名称即可。

+0

THX @fundeldman,你可以开发更多的有关要求做出抢用的ressource网址批处理API(没有github和授权)?非常感谢 – abernier