Прочная фиксация слияния из источника не обновляет рабочее дерево

Аналогично этому вопросу, но вместо создания нового файла я пытаюсь выполнить слияние из источника. После создания нового индекса с использованием Rugged::Repository merge_commits и новой фиксации слияния git сообщает, что новый файл (исходящий из origin) удален.

Создайте индекс слияния,

> origin_target = repo.references['refs/remotes/origin/master'].target
> merge_index = repo.merge_commits(repo.head.target, origin_target)

и новый коммит слияния,

> options = {
     update_ref: 'refs/heads/master', 
     committer: {name: 'user', email: '[email protected]', time: Time.now},
     author: {name: 'user', email: '[email protected]', time: Time.now},
     parents: [repo.head.target, origin_target],
     message: "merge `origin/master` into `master`"}

и обязательно используйте дерево из индекса слияния.

> options[:tree] = merge_index.write_tree(repo)

Создайте фиксацию

> merge_commit = Rugged::Commit.create(repo, options)

Проверяем, что наш HEAD обновился:

> repo.head.target.tree
=> #<Rugged::Tree:16816500 {oid: 16c147f358a095bdca52a462376d7b5730e1978e}>                                             
 <"first_file.txt" 9d096847743f97ba44edf00a910f24bac13f36e2>                                                      
 <"second_file.txt" 8178c76d627cade75005b40711b92f4177bc6cfc>                                                             
 <"newfile.txt" e69de29bb2d1d6434b8b29ae775ad8c2e48c5391>

Выглядит неплохо. Я вижу новый файл в файле index. Запишите его на диск.

> repo.index.write
=> nil

... но git сообщает, что новый файл удален:

$ git st
## master...origin/master [ahead 2]
 D newfile.txt

Как я могу правильно обновить свой индекс и рабочее дерево?


person occamsquattro    schedule 15.01.2015    source источник
comment
Вызов repo.reset repo.head.target, :hard отменяет удаление и повторный вызов возвращает меня в чистый рабочий каталог. Таким образом, я могу подтвердить, что repo.index.write не записывает рабочий каталог, несмотря на то, что указано в документы. Итак, как мне обновить рабочий каталог?   -  person occamsquattro    schedule 16.01.2015


Ответы (1)


Существует важное различие между репозиторием Git и рабочим каталогом. В то время как наиболее распространенные команды git из командной строки работают как с рабочим каталогом, так и с репозиторием, команды более низкого уровня libgit2/librugged в основном работают только с репозиторием. Это включает в себя запись индекса, как в вашем примере.

Чтобы обновить рабочий каталог в соответствии с индексом, должна работать следующая команда (после записи индекса):

options = { strategy: force }
repo.checkout_head(options)

Документы для checkout_head: http://www.rubydoc.info/github/libgit2/rugged/Rugged/Repository#checkout_head-instance_method

Примечание. Я тестировал update_ref: 'HEAD' для коммита. Я не уверен, что update_ref: 'refs/heads/master' будет иметь такой же эффект.

person Ralf    schedule 27.01.2015