Как изменить источник слияния Git-поддерева - PullRequest
4 голосов
/ 08 июля 2010

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

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

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 22 июля 2010

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

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

1 голос
/ 27 июля 2010

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

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

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

git branch MY_LIBFOO REMOTE_BRANCH_LIBFOO

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

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

git push original_libfoo MY_LIBFOO:TARGET_BRANCH_REMOTELY

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

1 голос
/ 12 июля 2010

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

git remote update

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

git cherry-pick <sha1>

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

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

...