如何以编程方式使用Rugged创建提交?

时间:2013-06-03 20:37:00

标签: ruby git libgit2 rugged

我正在尝试使用Ruggedlibgit2的Ruby绑定)以编程方式创建对现有存储库的提交。我试图遵循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@email.com',: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.0Rugged 0.18.0.gh.de28323更新为gem install --prerelease rugged。我上面详述的代码现在似乎有效。我不确定为什么它不适用于0.16.0。这个人似乎遇到了他们在this answer中详细说明的问题。

1 个答案:

答案 0 :(得分:3)

看起来你正在将nil传递给index.add,但是它不接受它,而该行中的错误只是之前未能检查错误的症状。 repo.write的第二个参数应该是符号,而不是字符串,因此最有可能返回nil来表示错误。传递:blob代替'blob'应该修复它。

您可以查看我们用于生成libgit2自己文档的https://github.com/libgit2/docurium/blob/master/lib/docurium.rb#L115-L116和周围代码。