How to update the working directory when creating a commit with Rugged/libgit2?

I’m trying to create a commit with rugged using the following test script:

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)

The commit is created, and the script outputs 773d97f453a6df6e8bb5099dc0b3fc8aba5ebaa7 (the SHA of the new commit). The generated commit and tree look like they’re supposed to:

  • How to forward ssh key in ansible to checkout git repository on target machine from origin?
  • How do I clone over HTTP a repository that has no info/refs?
  • Git on Windows: could not create leading directories error
  • Why can't I clone a git repo for readthedocs to build the documentation?
  • push local master *into* gh-pages branch on github
  • PS1 env variable does not work on mac
  • 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
    

    However, the working directory is not updated:

    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
    

    I have to do a git reset --hard HEAD to get the missing file test.md to show up in the working directory. I thought creating a Rugged commit, and setting :update_ref => "HEAD", was supposed to update the working directory automatically, but something must be going wrong, because doing r.checkout_head also has no effect. However, I think I’m following the rugged examples correctly. What am I missing here?

    EDIT:

    ludwig$ gem list rugged
    
    *** LOCAL GEMS ***
    
    rugged (0.21.2)
    

  • Cloud build failing on git submodules
  • Managing development of 2+ nodejs packages with dependencies
  • git for two applications with one different file
  • git first number in ls-tree output
  • quitting git log from a bash script
  • BitBucket - Create repository and sub modules
  • One Solution collect form web for “How to update the working directory when creating a commit with Rugged/libgit2?”

    The steps you’re taking are those for when you do not want to affect the workdir or current branch. You are not creating the file and you are not writing the modified index to disk.

    If you want to put a file on the filesystem and then track it in a new commit, start by creating the file

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

    and then commit as you are doing now.

    Git Baby is a git and github fan, let's start git clone.