8

スラッグサイズが 300MB に制限されている Heroku で node.js (express) を使用しています。

スラッグを小さく保つために、git-lfs を使用してエクスプレス フォルダーを追跡したいと考えていpublicます。

そのようにして、すべてのアセット (画像、ビデオなど) が lfs-store (AWS S3 など) にアップロードされ、git-lfs はポインター ファイルを残します (おそらく S3 URL が含まれていますか?)。

パブリック フォルダーからファイルを提供するときに、リモート S3 ファイルへの高速リダイレクトが必要です。

私の問題は、ポインター ファイルのコンテンツから URL を取得する方法がわからないことです...

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 をキャッシュすることはできますか?

4

2 に答える 2

10

実際には、pointerファイルには URL 情報が含まれていません (提供したリンクまたはここoidで確認できるように) sha256

ただし、バッチ リクエストを使用して特定の をダウンロードできるoidおよび lfs APIを使用して、探しているものを実現できます。oid

.git/config次のような既定以外のlfsurlタグを受け入れることができるBLOB を格納するために使用されるエンドポイントが何であるかがわかります。

[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

ただし、GitHub のリダイレクト応答にはおそらくいくつかの認証情報も含まれているため、S3 に対して直接ではなく、それに対して作業する必要があります。

応答の構造を確認するには、バッチ応答ドキュメントを確認してください。基本的には、関連する部分を解析し、独自の呼び出しを行って BLOB を取得する必要があります (これは、git lfsチェックアウト時に代わりに行われることです)。

典型的な応答 (参照したドキュメントから取得) は次のようになります。

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

したがって、バッチ応答から返されたものはGET https://storage-server.com/OID何でも使用しますheaders-最後のステップは、返されたblobの名前を変更することです(通常、oidgit lfsがチェックサムベースのストレージを使用するため、名前はそのままになります)-ポインターファイルには元のリソースの名前があるため、ブロブの名前をそれに変更するだけです。

于 2016-05-05T06:41:53.180 に答える