提问人:David Roy 提问时间:11/15/2023 最后编辑:David Roy 更新时间:11/15/2023 访问量:36
Rails Rugged::Repository 返回一个空的存储库
Rails Rugged::Repository returning an empty repository
问:
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
使用上面的代码,当我的代码确实将 repo 克隆到 temp_dir 中时,walker 为我提供了一个只有一个 .git 目录的空 repo。git clone http://localhost:3000/git/serve_repo.git
关于如何获得响应以流式传输完整存储库的任何建议?我稍后将重写 git main。
对于上下文,这里的计划是我将为私有存储库提供一个经过哈希处理的 URL,一些东西
类似于用户获得对此私有存储库的只读访问权限。git clone https://example.com/4f404c1370fddb6a93fa0c2879f7c23f39a7e94f4dca46d85b2194cede641847.git asset
答:
0赞
disanv
11/15/2023
#1
也许使用更简单的 Walker 版本来只提取您想要的内容
require 'rugged'
repo_path = './my_git_repo'
repo = Rugged::Repository.new(repo_path)
walker = Rugged::Walker.new(repo)
walker.sorting(Rugged::SORT_TOPO | Rugged::SORT_REVERSE)
walker.push(repo.head.target_id)
walker.each do |commit|
puts "Commit: #{commit.oid} - #{commit.message}"
commit.tree.each_blob do |blob|
puts " File: #{blob[:name]}"
puts " Content:"
puts repo.lookup(blob[:oid]).content
end
end
我使用each_blob使它尽可能简单。 只是为了确定您所说的“只有 .git 目录的空存储库”是什么意思,在 .git 中没有什么可以交互的?
评论