Слияние двух филиалов в Rugged
Используя Rugged, я создаю новую ветку из master
(давайте назовем это new_branch
), измените файл и создайте коммит для этого. Теперь я хочу объединить эту ветку в master
, нажмите мастер для удаленного и удалить new_branch
,
На момент запуска приведенного ниже кода нет ни измененных файлов, ни промежуточных файлов ни в одной из веток, так как измененные зафиксированы в new_branch
,
Это код, который я использую:
from_branch = @repo.head.name
their_commit = @repo.branches[into_branch].target_id
our_commit = @repo.branches[from_branch].target_id
index = @repo.merge_commits(our_commit, their_commit)
if index.conflicts?
# conflicts. deal with them
else
# no conflicts
commit_tree = index.write_tree(@repo)
@repo.checkout(into_branch)
commit_author = { email: GIT_EMAIL, name: GIT_NAME, time: Time.now }
Rugged::Commit.create(@repo,
committer: commit_author,
message: "Merge #{from_branch} into #{into_branch}",
parents: [@repo.head.target, our_commit],
tree: commit_tree,
update_ref: @repo.branches[into_branch].canonical_name)
@repo.push('origin', [@repo.head.name], { credentials: @cred })
@repo.branches.delete(from_branch)
end
Это работает, как и ожидалось (измененный файл объединен в master
, он передается удаленному и новая ветвь удаляется), однако, как только это будет сделано, я остаюсь с измененным файлом, показанным под master
как измененный и подготовленный, готовый к фиксации, в то время как в рабочем каталоге не должно быть никаких измененных файлов и ничего не подготовлено. Все должно быть в курсе.
1 ответ
В вашем коде вы обновляете произвольную ветвь, поэтому индекс и рабочее дерево не должны вызывать беспокойства в общем случае.
Если вы объединяетесь с текущей ветвью, то (и только тогда) вы пропускаете шаги по обновлению как индекса, так и рабочего дерева с результатами слияния. Ты можешь использовать
@repo.checkout_tree(commit_tree)
извлекать файлы в том виде, в котором они находятся в результирующем коммите. Это также обновит индексный файл репозитория, чтобы иметь содержимое этого дерева. Затем вы можете обновить текущую ветку, указав на коммит слияния.
У вас есть звонок в @repo.checkout(into_branch)
но так как вы уже, кажется, в into_branch
в вашем случае это в лучшем случае ничего не сделает. Вам нужно проверить результат слияния, ветвь, индекс или рабочий каталог не затрагиваются @repo.merge_commits()
вызов.