我正在尝试使用Rugged(libgit2的Ruby绑定(bind))以编程方式创建对现有存储库的提交。我试图遵循Rugged README中提供的文档,但是我认为它与代码库的当前状态并不完全匹配。尝试运行以下代码时,我总是收到错误消息:
require 'rugged'
# Create an instance of the existing repository
repo = Rugged::Repository.new('/full/path/to/repo')
# grab the current Time object for now
curr_time = Time.now
# write a new blob to the repository, hang on to the object id
oid = repo.write("Some content for the this blob - #{curr_time}.", 'blob')
# get the index for this repository
index = repo.index
# add the blob to the index
index.add(:path => 'newfile.txt', :oid => oid, :mode => 0100644)
curr_tree = index.write_tree(repo)
curr_ref = 'HEAD'
author = {:email=>'[email protected]',:time=>curr_time,:name=>'username'}
new_commit = Rugged::Commit.create(repo,
:author => author,
:message => "Some Commit Message at #{curr_time}.",
:committer => author,
:parents => [repo.head.target],
:tree => curr_tree,
:update_ref => curr_ref)
我得到的当前错误是
index.add
行有问题。它说TypeError: wrong argument type nil (expected Fixnum)
。任何对更好地理解如何创建具有坚固性的新提交的帮助将不胜感激。
更新
我只是通过运行
Rugged 0.16.0
将Rugged 0.18.0.gh.de28323
更新为gem install --prerelease rugged
。我上面详述的代码现在似乎可以正常工作。我不确定为什么它在0.16.0下不起作用。这个人似乎有与this answer中详述的问题相同的问题。 最佳答案
看来您要将nil
传递给index.add
,在那里它不接受一个,而该行中的错误只是未能更早检查错误的症状。 repo.write
的第二个参数应该是符号,而不是字符串,因此它很可能返回nil
来指示错误。传递:blob
而不是'blob'
应该可以解决此问题。
您可以看一下https://github.com/libgit2/docurium/blob/master/lib/docurium.rb#L115-L116和我们用于生成libgit2自己的文档的周围代码。