0

私はGrit(Ruby gem)を使用してgitリポジトリをロードし、特定のコミットをフォルダに抽出してから、それを「実行」しています。Grit は、「tar アーカイブを含む文字列」を返すarchive_tarで git アーカイブをサポートします。可能であればRuby libs / gemsを使用して(直接システムコールではなく)これをファイルシステムに抽出し、最初にデータをアーカイブに保存してから抽出するなどのことを避けたいと思います(ここで効率的なワンライナーを本当に探しています)。

4

1 に答える 1

2

'tarアーカイブを含む文字列'が同等であるという仮定の下で

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

fileutils、stringio、およびminitargemを使用してこれを実現できます。まず、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 })

もちろん、File.open部分全体をGritgemのarchive_tar機能に置き換えます。これはすべて、もちろん最初の仮定を前提としていますが、この方法はarchive_tar実際に返されるものに合わせて簡単に適合させることができると確信しています。

于 2012-10-22T02:38:05.430 に答える