2014-12-04 1 views
2

Я пытаюсь создать коммлю с неровным, используя следующий тестовый сценарий:Как обновить рабочий каталог при создании фиксации с помощью Rugged/libgit2?

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 => "[email protected]"} 
options = { 
    :tree => tree, 
    :parents => parents, 
    :committer => actor, 
    :message => "message", 
    :update_ref => "HEAD" 
} 
puts Rugged::Commit.create(r, options) 

фиксация будет создан, и сценарий выводит 773d97f453a6df6e8bb5099dc0b3fc8aba5ebaa7 (УВЙ из нового коммита). Сформированные фиксации и дерева выглядят, как они должны:

ludwig$ git cat-file commit 773d97f453a6df6e8bb5099dc0b3fc8aba5ebaa7 
tree 253d0a2b8419e1eb89fd462ef6e0b478c4388ca3 
parent bb1593b0534c8a5b506c5c7f2952e245f1fe75f1 
author Actor <[email protected]> 1417735899 +0100 
committer Actor <[email protected]> 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 также не имеет никакого эффекта. Однако, я думаю, что я правильно следую the rugged examples. Что мне здесь не хватает?

EDIT:

ludwig$ gem list rugged 

*** LOCAL GEMS *** 

rugged (0.21.2) 

ответ

0

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

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

# 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 
... 

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

+0

Ах, я ожидал, что он будет постоянно обновлять рабочий каталог, потому что JGit делает это, а также при добавлении индекса через API-интерфейс сантехники. Благодарим вас за разъяснение, что прочный не должен работать так. Я был смущен, потому что 'r.checkout_head' не работал, но похоже, что это было потому, что я забыл правильно установить вариант стратегии:. – dometto