2010-06-18 57 views
0

我一直試圖在ruby腳本中使用ruby-git gem進行提交等操作,但是檢查當前狀態的方法總是會引發錯誤。我的理解是,這個代碼雖然沒有太多,但應該是有效的。Ruby-Git g.status總是失敗

#gem install git 
require 'rubygems' 
require 'git' 

g = Git.init 
g.status 

但它返回:

Git::GitExecuteError: git diff-index "HEAD" 2>&1:fatal: ambiguous argument 'HEAD': >unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
from /Users/X/bin/ruby-ee-1.8.7/lib/ruby/gems/1.8/gems/git-1.2.5/lib/git/lib.rb:700:in command'
from /Users/X/bin/ruby-ee-1.8.7/lib/ruby/gems/1.8/gems/git-1.2.5/lib/git/lib.rb:672:in
command_lines'
from /Users/X/bin/ruby-ee-1.8.7/lib/ruby/gems/1.8/gems/git-1.2.5/lib/git/lib.rb:287:in diff_index'
from /Users/X/bin/ruby-ee-1.8.7/lib/ruby/gems/1.8/gems/git-1.2.5/lib/git/status.rb:99:in
construct_status'
from /Users/X/bin/ruby-ee-1.8.7/lib/ruby/gems/1.8/gems/git-1.2.5/lib/git/status.rb:8:in initialize'
from /Users/X/bin/ruby-ee-1.8.7/lib/ruby/gems/1.8/gems/git-1.2.5/lib/git/base.rb:175:in
new'
from /Users/X/bin/ruby-ee-1.8.7/lib/ruby/gems/1.8/gems/git-1.2.5/lib/git/base.rb:175:in `status'
from (irb):5

任何一個是否有如何讓內紅寶石當前的git狀態的例子(使用紅寶石GIT)?

頁我看過:
http://rubygems.org/gems/git
http://git.rubyforge.org/

感謝

回答

1

路徑可能是錯誤消息

unknown revision or path not in the working tree. I tried running:

$ irb 
> require 'rubygems' 
> require 'git' 
> g = Git.init 
> g.status 

的目錄中的重要位日在沒有git repo的情況下,它就像你的一樣炸燬了。

經過cd ing進入根目錄一個項目的目錄與一個git倉庫,它的工作。

檢查您是否位於git倉庫的根目錄。它應該有一個.git目錄。如果不是,由於某種原因,如果cd ing不方便,也可以將路徑傳遞給Git.init

+0

的Git.init應使當前目錄中的git回購。所以不知道你爲什麼失敗。但是我正在運行一個包含.git /的文件夾。 – Morgan 2010-06-19 07:53:57

+0

啊,我試過一個預先存在的.git/repo,它工作。一定是因爲Git.init沒有做到我想的那樣。 謝謝 – Morgan 2010-06-19 08:10:48

+0

如果沒有提交,狀態將會非常糟糕。 – Morgan 2010-06-19 08:24:07

2

我無法回答如何在沒有提交任務的情況下獲得狀態的問題,但我可以嘗試解釋它爲什麼會被炸燬。

Git :: Status類通過對存儲庫執行HEAD的git diff來工作。在Git中,「HEAD」表示當前分支&工作樹。因爲分支基本上是一個指向特定提交的指針(分支指針在創建新提交時沿着歷史記錄移動),直到有提交將其指向時,纔會真正存在分支(甚至不是主分支)。如果沒有分支,HEAD也不存在。因此,在git diff中引用它會引發錯誤。

這是一個偉大的視覺引導理解HEAD /分支機構/承諾:http://marklodato.github.com/visual-git-guide/

所以在最後,似乎試圖在沒有提交一個混帳回購協議做任何事情是有點意思的。當然,要做一個提交,你需要一個文件。所以,你可能需要:

#gem install git 
require 'rubygems' 
require 'git' 

#Create an empty file 
FileUtils.touch 'README' 

g = Git.init 
g.add('README') 
g.commit('First Commit') 
g.status 

如果要檢查文件是否已被添加到回購:

#gem install git 
require 'rubygems' 
require 'git' 

#Create an empty file 
FileUtils.touch 'README' 

g = Git.init 
g.ls_files.has_key?("README") #False 

g.add("README") 
g.commit("First Commit") 

g.ls_files.has_key?("README") #True 
+0

謝謝。我現在明白了,但我不喜歡它。我認爲它應該更好地處理這樣的事情,對於命令行git它可以,因爲它正在輸出信息,但是對於ruby命令來說,只是失敗而已,很煩人。 我試圖做一個狀態,看看我的文件是否已被添加,這是我不能做的,直到它被添加!這是一個腳本版本控制只有一個文件。 – Morgan 2010-06-19 17:47:50

+0

ls_files那古老的板栗。感謝不是Scott Chacons的例子,我一直提到。 – Morgan 2010-06-19 18:20:47