2016-04-27 51 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