Как изменить источник слияния Git поддерева

У меня есть проект, где я слился с библиотекой, используя поддерево Git. Я подтолкнул несколько небольших изменений между библиотекой и проектом.

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

Теперь я хочу изменить свой проект так, чтобы он вытягивал / выталкивал библиотеку из нового места. В первый раз, когда это происходит, мне также необходимо разрешить любые конфликты слияния, хотя в этом случае изменения тривиальны, и их можно будет просто переделать позже.

Каков наилучший способ сделать это?

Я попытался удалить, взяв копию библиотеки в моем проекте, затем удалив ее вместе со старыми пультами и ветками. Затем я попытался добавить поддерево и т.д. из нового местоположения. Кажется, это работает, но когда я пытаюсь вернуться из своего проекта в библиотеку, я получаю фатальную ошибку плохого объекта.

Я предполагаю, что в подходе, который я пробовал, есть недостаток - возможно, из-за отсутствия общей истории - но у меня нет достаточно глубокого понимания того, что происходит, чтобы знать, как это исправить, или что "правильный" подход к этой проблеме должен быть.

[обновление: отредактировал вопрос, чтобы сделать его немного яснее - это было немного двусмысленно]

3 ответа

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

git remote update

Это подтянет все ссылки из вашего проекта. сейчас делаю

git cherry-pick <sha1>

Ша, что вы хотите в новом проекте. Это самый простой способ, я думаю.

Также вы должны знать, что git не требует общей истории (хотя это делает менее приятным объединение в первый раз) для объединения. так что вы можете просто делать то, что я сказал, и тогда вместо того, чтобы собирать вишню, вы можете объединить свою историю. вероятно, будут конфликты. Я предлагаю, как только вы начнете слияние (если вы это сделаете) использовать git mergetool и знать, как использовать 3-х сторонний дифференциал.

Есть ли какая-то причина, по которой вы не ссылаетесь на свою библиотеку в качестве подмодуля вашего проекта?
(См истинную природу подмодулей)

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

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

Итак, чтобы перейти к исходному удаленному репо, сначала подготовьте локально то, что, как вы ожидаете, будут отображаться как коммит удаленно; для этого могут быть разные рабочие процессы: либо во время работы над проектом вы сначала фиксируете изменения своей библиотеки в своей специальной локальной рабочей ветви, выделенной для библиотеки (эта ветвь должна наследовать исходную историю библиотеки), а затем объединяются эта ветка с библиотекой переходит в рабочую ветку вашего проекта (где библиотека является поддеревом) или объединяет ваши изменения из рабочей ветки проекта в выделенную рабочую ветку библиотеки. Затем вы можете перенести свою выделенную рабочую ветку в исходное удаленное хранилище, когда пожелаете.

Итак, по сути, сначала вы создаете локальную выделенную рабочую ветку, чтобы она наследовала исходную историю:

git branch MY_LIBFOO REMOTE_BRANCH_LIBFOO

(REMOTE_BRANCH_LIBFOO - это интересующая вас локальная удаленная ветвь, которая обновляется при помощи git fetch)

затем, следуя вашему рабочему процессу, убедитесь, что ваши изменения в библиотеке находятся в рабочей ветке MY_LIBFOO, а затем вы можете

git push original_libfoo MY_LIBFOO:TARGET_BRANCH_REMOTELY

Таким образом, есть четкое представление о том, что происходит.

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