【问题标题】:How to update the working directory when creating a commit with Rugged/libgit2?使用 Rugged/libgit2 创建提交时如何更新工作目录?
【发布时间】:2014-12-04 23:45:23
【问题描述】:

我正在尝试使用以下测试脚本创建一个坚固的提交:

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 提交并设置 :update_ref =&gt; "HEAD" 应该会自动更新工作目录,但一定是出了问题,因为这样做 r.checkout_head 也没有效果。但是,我认为我正确地关注了the rugged examples。我在这里错过了什么?

编辑:

ludwig$ gem list rugged

*** LOCAL GEMS ***

rugged (0.21.2)

【问题讨论】:

    标签: ruby git libgit2 rugged


    【解决方案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
    ...
    

    然后像现在一样提交。

    【讨论】:

    • 啊,我期待着将工作目录更新到最新状态,因为 JGit 这样做了,在通过“管道”API 添加到索引时也是如此。感谢您澄清坚固性不应该那样工作。我很困惑,因为r.checkout_head 不起作用,但看起来那是因为我忘记正确设置 :strategy 选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 2014-10-17
    相关资源
    最近更新 更多