Ошибка «index ateded the repository» из libgit2 при записи дерева из индекса для фиксации «pull» - PullRequest
1 голос
/ 12 февраля 2020

Когда я делаю index.write_tree()) (index - это Index, полученное в результате слияния с использованием merge_commits), я получаю сообщение об ошибке «Не удалось записать дерево. Файл индекса не резервируется существующим хранилищем» , У меня есть существующее хранилище. [В оригинальной версии этого поста он был пустым, но я изменил его на не голый, и он все еще не работает.] Что я делаю не так?

В общем, я пытаюсь реализовать git pull (выборка, затем слияние). В догоняющем случае я понимаю, что после извлечения и слияния мне нужно выписать коммит. Это то, что я пытаюсь сделать. Как я могу это сделать?

По сути, мой код

 let index = repo.merge_commits(&our_commit, &their_commit, Some(&MergeOptions::new()))?;
 if !index.has_conflicts() {
   let new_tree_oid = index.write_tree()?; // error occurs here
   let new_tree = repo.find_tree(new_tree_oid)?;
   //...
 }

Я использую ящик git2 для ржавчины, который обертывает библиотеку libgit2.

1 Ответ

2 голосов
/ 17 февраля 2020

У вас есть индекс в памяти , у вас нет индекс хранилища . Это различие мешает вам написать его.

У вас есть несколько вариантов работы с индексом в памяти:

  1. Вы можете преобразовать его в дерево (и тогда вы можете создать коммит, который использует это дерево), используя git_index_write_tree_to. Функция write_tree_to позволит вам указать репозиторий, в который вы хотите писать.
  2. Вы можете сделать его индексом репозитория, используя git_repository_set_index.

Хотя я хотел бы спросить, почему вы используете git_merge_commits вместо просто git_merge, который должен позаботиться обо всем этом для вас, включая решение конфликтов. Если вы действительно делаете эмуляцию git pull, то вам нужно с этим справиться.

...