Как обновить рабочий каталог при создании коммита с помощью Rugged/libgit2?

Я пытаюсь создать коммит с помощью rugged, используя следующий тестовый скрипт:

require "rugged"
r = Rugged::Repository.new(".")
index = r.index
index.read_tree(r.references["refs/heads/master"].target.tree)
blob = r.write("My test", :blob)
index.add(:oid => blob, :path => "test.md", :mode => 0100644)
tree = index.write_tree
parents = [r.references["refs/heads/master"].target].compact
actor = {:name => "Actor", :email => "actor@bla"}
options = {
    :tree => tree,
    :parents => parents,
    :committer => actor,
    :message => "message",
    :update_ref => "HEAD"
}
puts Rugged::Commit.create(r, options)

Коммит создан, и скрипт выводит 773d97f453a6df6e8bb5099dc0b3fc8aba5ebaa7 (SHA нового коммита). Сгенерированный коммит и дерево выглядят так:

ludwig$ git cat-file commit 773d97f453a6df6e8bb5099dc0b3fc8aba5ebaa7
tree 253d0a2b8419e1eb89fd462ef6e0b478c4388ca3
parent bb1593b0534c8a5b506c5c7f2952e245f1fe75f1
author Actor <actor@bla> 1417735899 +0100
committer Actor <actor@bla> 1417735899 +0100

message
ludwig$ git ls-tree 253d0a2b8419e1eb89fd462ef6e0b478c4388ca3
100644 blob a7f8d9e5dcf3a68fdd2bfb727cde12029875260b    Initial file
100644 blob 7a76116e416ef56a6335b1cde531f34c9947f6b2    test.md

Однако рабочий каталог не обновляется:

ludwig$ ls
Initial file   rugged_test.rb
ludwig$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    test.md

Я должен сделать git reset --hard HEAD чтобы получить недостающий файл test.md чтобы показать в рабочем каталоге. Я думал, что создание Rugged commit и настройка :update_ref => "HEAD", должен был автоматически обновлять рабочий каталог, но что-то должно идти не так, потому что r.checkout_head также не имеет никакого эффекта. Тем не менее, я думаю, что правильно следую грубым примерам. Что мне здесь не хватает?

РЕДАКТИРОВАТЬ:

ludwig$ gem list rugged

*** LOCAL GEMS ***

rugged (0.21.2)

1 ответ

Шаги, которые вы предпринимаете, - это те, для которых вы не хотите влиять на рабочий каталог или текущую ветку. Вы не создаете файл и не записываете измененный индекс на диск.

Если вы хотите поместить файл в файловую систему, а затем отследить его в новом коммите, начните с создания файла

# Create the file and give it some content
f = open("test.md", "w")
f << "My test"
f.close

# The file from the workdir from to the index
# and write the changes out to disk
index = repo.index
index.add("test.md")
index.write

# Get the tree for the commit
tree = index.write_tree
...

а затем совершить, как вы делаете сейчас.

Другие вопросы по тегам