我能否在grit中发出git clone命令并将进度输出到标准输出?

4
我很有信心地认为这要么是不可能的,要么我错过了一个明显的选项,但在查阅grit's Git class、链接到的这个SO post和其他grit标记的SO问题后,我一无所获。
我正在使用grit执行一系列rake任务来安装我的应用程序。其中一个任务克隆了几个存储库。
使用链接的gist中的代码作为示例,在grit中进行git克隆的输出如下(在irb、ruby 1.9.2中进行gem install grit后应该可以直接使用):
> 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" 

我的问题是:我能否在克隆命令实际运行时恢复其余的标准输出?"Cloning into /tmp/aws...\n"是输出的第一行,只有当克隆完成时才返回。
第二个问题是:如果使用grit无法在克隆过程中恢复克隆进度,是否有其他方法可以显示命令在进行时的进度?我的担忧是我们的一些存储库非常大,我想给我的rakefile用户一些东西,这样他们就不会认为脚本只是在尝试与远程通信时挂起。
供参考,git clone命令的“正常”输出如下:
$ 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.

快速提示:这里描述的一些功能,特别是:process_info,需要一个最新版本的gem,截至今日2011年9月26日,该gem自2011年1月23日以来未更新(非常感谢Daniel Brockman在下面指出)。您需要从github克隆手动构建它。

解决方案

如果您使用:process_info:progress给Clone提供正确的信息(我的原始示例失败了,因为我使用了过时的gem),则Clone将正确地将信息传递到stderr。以下是可行的代码。由于上述原因,至少目前,您需要手动构建gem。

> 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]   # i.e. 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.

尝试运行git clone git://github.com/cookbooks/aws.git /tmp/test-aws 2>/dev/null,您将看到输出的哪些部分将转到stderr。 - Daniel Brockman
不行。该命令没有任何输出。我还运行了repo.fetch({:process_info => true}) (之前忘记运行了),并得到了结果 [0, "", ""] - Christopher
当“git fetch”无事可做时,应该发生这种情况。 - Daniel Brockman
啊,这样就行了。是的,使用:process_info进行获取会将最后一行获取到stderr字符串中。但我仍然无法让它与clone一起工作,但我在上面关于fetch的理解肯定是错误的。 - Christopher
好的,你一直是对的。我的过时宝石组合加上没有传递 :progress 到克隆引起了这个问题。 - Christopher
太好了,你解决了它!万岁!:D - Daniel Brockman
1个回答

2

抱歉,应该在原帖中添加这些信息。我尝试过 :process_info 选项(可能使用不正确)。当运行与我知道不需要 :process_info 的简化选项相同的命令时,它根本无法克隆。它立即输出一个空字符串:> gritty.clone({:branch => '37s', :timeout => false, :process_info => true}, "git://github.com/cookbooks/aws.git", "/tmp/aws-new") => "" - Christopher
1
通过设置Grit.debug = true,你可以看到发生了什么。此外,通过使用blame,你会发现:process_info是在这个提交中引入的,日期为2011年2月6日;然而,Grit的最新版本是从2011年1月13日的。 - Daniel Brockman
得到了最新版本的 gem(因此也包括 :process_info),但是 [exitstatus,out,err] 元组仍然只返回克隆的第一行,没有更多内容。来自我第一条评论的 irb 命令输出:=> [0, "Cloning into /tmp/aws-new...\n", ""] - Christopher
在问题中添加了一个带有工作理论的更新,但我真的不确定我是100%正确的。 - Christopher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接