Rails Rugged::Repository 返回一个空的存储库

Rails Rugged::Repository returning an empty repository

提问人:David Roy 提问时间:11/15/2023 最后编辑:David Roy 更新时间:11/15/2023 访问量:36

问:

  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

Ruby-on-Rails 红宝石 加固

评论


答:

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 中没有什么可以交互的?