10

我正在尝试将ruby​​-progressbar gem 与ruby​​-git gem一起使用

我的目标是在 git clone 期间捕获动态进度条,以便我可以获取此 git clone 的进度条

我正在尝试以这种方式使用

 def my_method
  p = ProgressBar.create(:format => '%a %B %p%% %t')
  Git.clone('git://github.com/ankit8898/rubymotion-inspect.git','my_repo',:path => '.') do
    p.increment
   end
 end

我无法按预期获得进度条。

我初始化进度条的方式有什么问题吗?

提前致谢!

4

2 回答 2

4

Git.clonehttps://github.com/schacon/ruby-git/blob/master/lib/git.rb#L87)预计不会出现阻塞。所以你通过的块被简单地忽略了。

我不明白这是怎么可能的,除了修改ruby-gitgem 来启用进度通知。

于 2013-05-19T18:09:39.563 回答
1

Git库添加2>&1到所有命令。所以你的克隆命令最终会像这样执行:

git clone ... 2>&1

最终抑制了所有输出。您需要做的就是覆盖一个调用run_commandin的方法Git::Lib,然后删除它2>&1。你可以试试这个irb

class Git::Lib
  class << self
    attr_accessor :verbose
  end

  def run_command(git_cmd, &block)
    git_cmd = git_cmd.gsub("2>&1", "").chomp if self.class.verbose
    if block_given?
      IO.popen(git_cmd, &block)
    else
      `#{git_cmd}`.chomp
    end
  end
end

我定义了一个额外的verbose属性。因此,每当您需要实际的 git 输出时,只需设置Git::Lib.verbose = true并运行Git.clone或任何其他命令,实际输出就会被打印出来。

这将做的是,一旦你设置Git::Lib.verbose = true然后调用Git.clone,它将显示 git 进度条,如下所示:

Cloning into 'rapidftr-addon-cpims'...
remote: Counting objects: 207, done.
remote: Compressing objects: 100% (108/108), done.
remote: Total 207 (delta 95), reused 201 (delta 90)
Receiving objects: 50% (105/207), 83.10 KiB | 112 KiB/s...
# ^^ The above line is git's progress bar, it will keep updating

它可能不会以您期望的特定格式显示进度条,但它仍会在下载发生时显示动态更新。

编辑:添加示例输出

于 2013-05-19T20:18:27.647 回答