2012-10-22 42 views
0

我正在使用Grit(Ruby gem)加载一个git仓库,将一个给定的提交提取到一个文件夹,然后'做些什么'。 Grit支持使用archive_tar的git归档文件,该文件可以回退'包含tar归档文件的字符串'。如果可能的话,我想使用Ruby libs/gems将其解压缩到文件系统中(而不是直接系统调用),并避免将数据先保存到压缩文件然后解压缩(真的在这里寻找一个有效的单行程)。在Ruby中,如何将tar归档流直接提取到文件系统?

+0

请显示您现在使用的代码。 –

+0

我之前并没有真正的代码。我刚刚用Grit制作了一个tar文件,然后将tar作为系统命令调用。 –

回答

2

在假设“包含tar归档字符串”等同于

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

我能够做到这一点使用文件实用程序,StringIO的,和minitar宝石。 首先,你需要安装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函数整个File.open一部分。这当然都假设了第一个假设,但我相信这个方法可以很容易地适应任何实际返回的情况。

+0

这很好用,例如'Grit :: Repo.new('repo_dir')。archive_tar('commit_id')'作为字符串。 –

相关问题