【问题标题】:Why does the file get removed when commiting second time via rugged?为什么通过坚固耐用的第二次提交时文件会被删除?
【发布时间】:2014-06-23 22:32:58
【问题描述】:

我想将文本文件存储在 Git 存储库中。我为此使用 Ruby 坚固的 gem 0.19.0。问题是添加第二个文件f2 似乎会自动删除第一个文件f1。我已经隔离了重现此代码的代码(基本上直接来自坚固的 gem 文档的代码):

require 'rugged'

def commit(file_name, message, content)
    user = { email: 'email', name: 'name', time: Time.now }

    repo = Rugged::Repository.new('repo')
    oid = repo.write(content, :blob)
    index = repo.index
    index.add(path: file_name, oid: oid, mode: 0100644)

    options = {}
    options[:tree] = index.write_tree(repo)
    options[:author] = user
    options[:committer] = user
    options[:message] = message
    options[:parents] = repo.empty? ? [] : [ repo.head.target ].compact
    options[:update_ref] = 'HEAD'
    Rugged::Commit.create(repo, options)
end

Rugged::Repository.init_at('repo', :bare)
commit('f1', 'create f1', 'f1 content')
commit('f2', 'create f2', 'f2 content')

在运行上述代码并克隆创建的裸仓库后,git log --name-status 显示第二次提交删除了 f1 文件。

如何解决此问题,以免与之前存储在存储库中的文件混淆?

【问题讨论】:

    标签: ruby git rugged


    【解决方案1】:

    坚固的自述文件

    oid = repo.write("This is a blob.", :blob)
    index = repo.index
    index.read_tree(repo.head.target.tree)   # notice
    index.add(:path => "README.md", :oid => oid, :mode => 0100644)
    

    但 repo.head.target 是 0.19.0 中的字符串

    oid = repo.write(content, :blob)
    index = repo.index
    
    begin
      commit = repo.lookup(repo.head.target)
      tree = commit.tree
      index.read_tree(tree)
    rescue
    end
    
    index.add(path: file_name, oid: oid, mode: 0100644)
    

    有效

    【讨论】:

    • 谢谢。这确实运行(没有错误),但这仍然不会以包含两个文件的回购结束 - 只有第二个文件存在,而第一个文件被删除。
    • 我在电脑上测试过,没问题。 ruby 2.0.0p451(2014-02-24 修订版 45167)[x86_64-darwin13.1.0] OSX 坚固(0.19.0)
    猜你喜欢
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 2011-01-29
    • 2018-04-04
    • 2020-11-21
    • 2014-11-25
    • 2017-05-16
    相关资源
    最近更新 更多