Устранение конфликтов слияния в Rugged

Я работаю над скриптом Ruby, который должен выполнить слияние. Что я хотел бы сделать, так это, учитывая целевую ссылку и фиксацию для слияния, попытаться объединить их, и если есть конфликты слияния, вернуть контроль пользователю для их разрешения, в основном точно так же, как git merge, поэтому пользователь может иметь дело с конфликтами, затем вызовите git my-merge --continue и продолжите с того места, на котором остановились.

Что у меня есть до сих пор это:

merge_index = @repo.merge_commits(@commit, target_tip, options)
unless merge_index.conflicts?
options = {
    :committer => @commit.committer,
    :author => @commit.author,
    :parents => [target_tip, @commit],
    :message => merge_message,
    :update_ref => @target.canonical_name,
    :tree => merge_index.write_tree(@repo)
}

commit = Rugged::Commit.create(@repo, options)
else
    # Here's where my unwritten code goes 
end

Возникает вопрос: учитывая merge_index, который у меня есть с некоторыми конфликтами, как мне привести мой рабочий каталог в состояние, представляемое им, чтобы я мог вернуться в оболочку и позволить пользователю разрешить их? Кажется, я не могу его записать (он будет жаловаться, что не может записать индекс, который не полностью объединен), и я не вижу очевидного способа установить для него мой текущий индекс.


person Anton    schedule 21.02.2015    source источник


Ответы (1)


Индекс слияния является результатом слияния. Если вы хотите, чтобы это был статус репозитория, вам нужно написать этот индекс как индекс репозитория, например

repo.index = merge_index
merge_index.write()

затем вы можете использовать checkout как обычно, что создаст маркеры конфликта для файлов в рабочем дереве.

Сама libgit2 git_merge() делает это за вас; вы можете захотеть сделать это доступным через Rugged, если вы не хотите выполнять шаги в своем коде.

person Carlos Martín Nieto    schedule 05.03.2015
comment
Когда я пытаюсь repo.index = merge_index, я получаю RuntimeError: данный объект уже принадлежит другому репозиторию. - person Anton; 06.03.2015
comment
Индекс, который вы получаете из git_merge_commits(), не принадлежит репозиторию, поэтому это указывает на ошибку на каком-то уровне. - person Carlos Martín Nieto; 08.03.2015
comment
Хорошо, это объяснило бы, почему у меня проблемы :). Я создал очень простое репо и написал очень простой скрипт Ruby, чтобы проверить это, и он, безусловно, терпит неудачу, поскольку объект уже принадлежит - person Anton; 09.03.2015