def serve_git_repo(temp_dir)
repo = Rugged::Repository.new(temp_dir)
response.headers["Vary"] = "Accept"
response.headers["Connection"] = "keep-alive"
response.headers["Content-Type"] = "application/octet-stream"
response.stream.write("")
walker = Rugged::Walker.new(repo)
walker.push(repo.head.target_id)
walker.each do |commit|
commit.tree.walk_blobs do |root, entry|
blob = repo.lookup(entry[:oid])
StringIO.new(blob.content).each(8000) do |chunk|
response.stream.write(chunk)
end
end
end
ensure
response.stream.close
end
字符串
对于上面的代码,当我git clone http://localhost:3000/git/serve_repo.git
时,代码确实将repo克隆到temp_dir中,然而,步行者为我提供了一个只有.git目录的空repo。
关于如何获得响应以流式传输完整的repo,有什么建议吗?我稍后会重写git main。
对于上下文,这里的计划是我将提供一个私有存储库的散列url,类似于git clone https://example.com/4f404c1370fddb6a93fa0c2879f7c23f39a7e94f4dca46d85b2194cede641847.git asset
,用户可以只读访问这个私有存储库。
1条答案
按热度按时间tcbh2hod1#
也许使用一个更简单的步行者版本,只提取你想要的
字符串
我使用each_blob来使它尽可能简单。只是为了确定你所说的“只有.git目录的空仓库”是什么意思,在.git中没有任何东西可以交互?