¿Puedo get el progreso de un command de clonación git, emitido en grit, para salir a stdout?

Estoy bastante seguro de que esto no es posible o me falta una opción obvia, pero después de consultar la class Git de grit , la esencia enlazada en esta publicación de SO , y las otras preguntas relacionadas con SO, me quedaré en blanco.

Estoy usando grit para una serie de tareas de rake que instalan mi aplicación. Una de estas tareas clona algunos repositorys.

Usando el código en la esencia vinculada como un ejemplo, esta es la salida de la clonación de git en grit (debería funcionar de la caja después de que una gem install grit en irb, ruby ​​1.9.2):

 > require 'grit' > gritty = Grit::Git.new('/tmp/filling-in') => #<Grit::Git:0x007f93ae105df8 @git_dir="/tmp/filling-in", @work_tree="/tmp/filling-in", @bytes_read=0> > gritty.clone({:quiet => false, :verbose => true, :progress => true, :branch => '37s', :timeout => false}, "git://github.com/cookbooks/aws.git", "/tmp/aws") => "Cloning into /tmp/aws...\n" 

Mi pregunta es esta: ¿Puedo recuperar el rest del command stdout del command clon, preferiblemente mientras el clon está sucediendo? La "Clonación en /tmp/aws…\n" es la primera línea de salida, y solo se devuelve una vez que se completa el clon.

Una pregunta secundaria sería: si no es posible recuperar el progreso del clon mientras está sucediendo con granalla, ¿hay alguna otra forma de mostrar el progreso del command mientras ocurre? Mi preocupación es que algunos de nuestros repositorys son bastante grandes y me gustaría darles algo a los usuarios de mi rakefile para que no concluyan que el script simplemente se cuelga al intentar comunicarse con el control remoto.

Como reference, la salida "normal" del command git clone sería:

 $ git clone git://github.com/cookbooks/aws.git /tmp/test-aws Cloning into /tmp/test-aws... remote: Counting objects: 12364, done. remote: Compressing objects: 100% (3724/3724), done. remote: Total 12364 (delta 7220), reused 12330 (delta 7203) Receiving objects: 100% (12364/12364), 5.92 MiB | 70 KiB/s, done. Resolving deltas: 100% (7220/7220), done. 

Nota rápida: algunas de las funcionalidades descritas aquí, a saber :process_info requiere una versión actualizada de la gem, que no se ha actualizado desde el 23 de enero de 2011, hasta el 26 de septiembre de 2011 (muchas gracias a Daniel Brockman por señalando eso, abajo). Tendrás que clonarlo desde github y comstackrlo manualmente.

SOLUCIÓN

Clone pasa la información correcta a stderr si le das :process_info y :progress (mi ejemplo original falló porque tenía una gem desactualizada). El siguiente es código de trabajo. Necesita build la gem manualmente por los motivos descritos anteriormente, al less en este momento.

 > require 'grit' > repo = Grit::Git.new('/tmp/throw-away') > process = repo.clone({:process_info => true, :progress => true, :timeout => false}, 'git://github.com/cookbooks/aws.git', '/tmp/testing-aws-again') # output supressed > print process[2] # ie the stderr string of the output remote: Counting objects: 12364, done. remote: Compressing objects: 100% (3724/3724), done. remote: Total 12364 (delta 7220), reused 12330 (delta 7203) Receiving objects: 100% (12364/12364), 5.92 MiB | 801 KiB/s, done. Resolving deltas: 100% (7220/7220), done. 

La razón por la que solo obtiene la primera línea de salida es que el rest se envía a stderr, no a stdout. Existe una opción :process_info que puede pasar para get el estado de salida, stdout y stderr. Ver https://github.com/mojombo/grit/blob/master/lib/grit/git.rb#L290 .