#ruby #git #rugged
#рубиновый #git #rugged
Вопрос:
Я хочу хранить текстовые файлы в репозитории Git. Для этого я использую Ruby rugged gem 0.19.0. Проблема в том , что добавление второго файла f2
, похоже , автоматически удаляет первый f1
. Я выделил код для воспроизведения этого (в основном код прямо из rugged gem docs).:
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
файл.
Как мне исправить это, чтобы не связываться с файлами, ранее сохраненными в репозитории?
Ответ №1:
Rugged README
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)
Это работает
Комментарии:
1. Спасибо. Это выполняется (без ошибок), но все равно это не приводит к созданию репозитория с обоими файлами — присутствует только второй файл, в то время как первый удаляется.
2. Я протестировал на своем компьютере, все в порядке. ruby 2.0.0p451 (редакция 45167 2014-02-24) [x86_64-darwin13.1.0] OSX rugged(0.19.0)