Слияние двух филиалов в 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() вызов.

Другие вопросы по тегам