我正在使用 Grit (Ruby gem) 加载 git repo,将给定的提交提取到文件夹,然后用它“做点什么”。Grit 支持带有archive_tar的 git 存档,它返回一个“包含 tar 存档的字符串”。如果可能的话,我想使用 Ruby libs / gems 将它提取到文件系统(不是直接系统调用),并避免先将数据保存到存档然后提取它(真的在这里寻找一个高效的单线)。
问问题
1640 次
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_tar
Grit gem 的功能替换整个 File.open 部分。当然,这一切都是假设第一个假设,尽管我确信这个方法可以很容易地适应任何archive_tar
实际返回的情况。
于 2012-10-22T02:38:05.430 回答