0

我正在使用 Grit (Ruby gem) 加载 git repo,将给定的提交提取到文件夹,然后用它“做点什么”。Grit 支持带有archive_tar的 git 存档,它返回一个“包含 tar 存档的字符串”。如果可能的话,我想使用 Ruby libs / gems 将它提取到文件系统(不是直接系统调用),并避免先将数据保存到存档然后提取它(真的在这里寻找一个高效的单线)。

4

1 回答 1

2

假设“包含 tar 存档的字符串”等价于

File.open("Downloads.tar", "rb") {|a| a.read }

我可以使用 fileutils、stringio 和 minitar gem 来完成这项工作。首先你需要安装 minitar,它应该很简单

gem install minitar

由于 minitar 不支持使用流的常规解包,我们将创建自己的基本解包方法。

require 'archive/tar/minitar'
require 'stringio'
require 'fileutils'

def unpack_tar(directory, string)
  FileUtils.mkdir_p(directory) if !File.exist?(directory)
  stringio = StringIO.new(string)
  input = Archive::Tar::Minitar::Input.new(stringio)
  input.each {|entry|
    input.extract_entry(directory, entry)
  }
end

unpack_tar("./test", File.open("Downloads.tar", "rb") {|a| a.read })

当然用archive_tarGrit gem 的功能替换整个 File.open 部分。当然,这一切都是假设第一个假设,尽管我确信这个方法可以很容易地适应任何archive_tar实际返回的情况。

于 2012-10-22T02:38:05.430 回答