2012-10-22 46 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')'作爲字符串。 –

相關問題