2011-09-26 25 views
4

我相當有信心,這是要麼不可能,要麼我失去了一個顯而易見的選擇,但諮詢grit's Git class後,主旨鏈接in this SO post,另砂礫標記問題上的SO,我來了空白。我可以得到以砂礫形式發出的git clone命令的輸出到stdout嗎?

我用砂礫一系列的安裝我的應用程序rake任務。其中一項任務克隆了一些存儲庫。

使用在linked gist作爲示例的代碼,這是GIT中克隆在砂礫的輸出(應IRB一個gem install grit後工作開箱,紅寶石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" 

我問題是:我能否恢復克隆命令的標準輸出的其餘部分,最好在克隆實際發生時進行? 「克隆到/tmp/aws...n」是輸出的第一行,並且僅在克隆完成時才返回。

的第二個問題是:如果這是不可能恢復克隆的進度,而它與砂礫發生,有另一種方式來顯示,而它發生的命令的進展如何?我擔心的是我們的一些存儲庫非常大,我想給rakefile的用戶一些東西,所以他們不會斷定腳本在試圖與遠程進行通信時掛起。

僅供參考,混帳克隆命令的「正常」了放是:

$ 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需要一個保持最新版本的寶石,自2011年1月23日起至今未更新,截至今天,2011年9月26日(非常感謝Daniel Brockman在下面指出)。你必須clone it from githubbuild it manually.

SOLUTION

克隆傳遞正確的信息給標準錯誤,如果你給它:process_info:progress(我原來的例子失敗了,因爲我有一個過時的寶石)。以下是工作代碼。至少在這個時候,您需要根據上述原因手動構建寶石。

> 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. 
+0

嘗試運行'git的克隆的git://github.com/cookbooks/aws.git的/ tmp /測試AWS 2>的/ dev/null',你會看到它的輸出部分要標準錯誤。 –

+0

沒有骰子。這命令我根本沒有輸出。還運行了'repo.fetch({:process_info => true})'(忘了先運行它)並得到'[0,「,」「]''。 – Christopher

+0

那麼,當'git fetch'無關時應該發生這種情況。 –

回答

2

你只得到第一行輸出的原因是它的其餘部分被髮送到stderr而不是stdout。有一個:process_info選項可以傳遞給退出狀態,stdout和stderr。見https://github.com/mojombo/grit/blob/master/lib/grit/git.rb#L290

+0

對不起,應該已將該信息添加到原始帖子。我嘗試了':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](https://github.com/mojombo/grit/blame/master/lib/grit/git.rb),你會發現在[this commit]中引入了':process_info'(https: //github.com/mojombo/grit/commit/019bae7c61b0236c093e1bb9eef3b134567b9aa7),從2011-02-06;然而,[最新版本的Grit](https://rubygems.org/gems/grit)是2011-01-13。 –

+0

得到了gem(因此':procces_info')工作的最新版本,但'[exitstatus,out,err]'元組仍然返回克隆的第一行,僅此而已。從我的第一個評論的irb命令輸出:'=> [0,「克隆到/tmp/aws-new...\n」,「」]' – Christopher

相關問題