我正在使用Grit(Ruby gem)来加载git repo,将一个给定的提交提取到一个文件夹,然后用它来“做东西”。 Grit支持使用archive_tar的git存档,它返回一个包含tar存档的字符串。如果可能的话,我想使用Ruby libs / gems将其提取到文件系统(而不是直接系统调用),并避免首先将数据保存到存档然后解压缩(这里真正寻找有效的单行)。 / p>
答案 0 :(得分: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 })
当然用Grit gem的archive_tar
函数替换整个File.open部分。这当然是假设第一个假设,尽管我确信这个方法可以很容易地适应,以适应archive_tar
实际返回的任何内容。