ruby Rails Rugged::Repository返回空的仓库

f87krz0w  于 2023-11-18  发布在  Ruby
关注(0)|答案(1)|浏览(96)
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,用户可以只读访问这个私有存储库。

tcbh2hod

tcbh2hod1#

也许使用一个更简单的步行者版本,只提取你想要的

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中没有任何东西可以交互?

相关问题