Я использовал расширение git -subtree (https://github.com/apenwarr/git-subtree) для управления подпроектами в рамках нашего основного проекта. Это делает именно то, что я хочу, кроме того, что он терпит неудачу, когда я пытаюсь разделить изменения, внесенные в подпроект из нашего основного проекта.
например. ранее я сделал
git subtree add -P Some/Sub/Dir --squash [email protected]:lib.git master
чтобы внести в код библиотеки код Some/Sub/Dir в нашем основном проекте. Все здесь отлично поработало, поэтому я переместил свои изменения в наш основной основной проект с открытым репозиторией git. Затем я решил внести изменения в свою локальную версию lib в Some/Sub/Dir, зафиксировать ее, а затем разбить ее, чтобы вернуть ее обратно в lib.git repo
git subtree split -P Some/Sub/Dir -b some_branch
все работает так, как ожидалось. Мне больше не нужна локальная копия репо, я удалил ее.
После клонирования новой копии репо из нашего центрального репо я внесла некоторые изменения в lib в Some/Sub/Dir и решил, что хочу разбить эти изменения и отбросить их обратно в репозиторий lib.git. Я пытаюсь использовать ту же команду разделения разделов, что и раньше, но на этот раз я получаю следующий вывод:
1/ 3 (0)
2/ 3 (1)
3/ 3 (1)
fatal: bad object d76a03f0ec7e20724bcfa253e6a03683211a7bb1
d76a03f0ec7e20724bcfa253e6a03683211a7bb1 происходит, когда я добавил поддерево:
commit 43b3eb7d69d5eb64241eddb12e5bd74fd0215083
Author: Ian Bond <[email protected]>
Date: Fri Apr 22 15:06:50 2011 -0400
Squashed 'Subtree/librepoLib/' content from commit d76a03f
git-subtree-dir: Subtree/librepoLib
git-subtree-split: d76a03f0ec7e20724bcfa253e6a03683211a7bb1
который фактически ссылается на фиксацию в репозитории lib.git.
То, что я смог собрать вместе (и я git noob, поэтому я могу ошибаться, что-то игнорировать или использовать неправильную терминологию здесь), заключается в том, что 'git subtree add --squash' введет всю историю с удаленного lib.git repo в текущее репо, отбросит его в отдельную фиксацию, а затем добавит эту фиксацию в рабочую ветвь. История фиксации lib.git остается в текущем репо, однако они оборваны, потому что на самом деле они не упоминаются иначе, чем через текст компиляции сквоша. Пока эти болтающиеся фиксации остаются, git -subtree может использовать их для выполнения расщеплений, однако, поскольку push или pull не содержат оборванных объектов (или если я запускаю gc и полностью обрезаю оборванные объекты), эти оборванные коммиты потерянный и git -subtree больше не имеет необходимой информации для выполнения разделения.
Я добавил a script, который полностью воспроизведет проблемы, которые у меня были.
Мои вопросы:
1). Что я могу сделать, чтобы справиться с существующей ситуацией, когда у меня теперь есть поддеревья, которые я хочу объединить обратно в исходное репо, но больше не имеют никакой истории, которая связывает их вместе. Моя нынешняя мысль - сделать что-то вроде:
git subtree split -P Some/Sub/Dir 43b3eb7^.. --ignore-joins -b splitBranch
чтобы разделить всю историю, так как "git поддерево добавить" и объединить его обратно в исходное репо (которое, к счастью, не изменилось с момента добавления). Это лучший способ пойти? Любые рекомендации о том, как я должен выполнить слияние?
2) Можно ли что-нибудь сделать, чтобы git -subtree работала так, как ожидалось? Я считаю, что если я опускаю параметр -squash на "git subtree add", тогда все будет работать, однако это приводит к тому, что в мое репо будет вложено множество несвязанной истории. Есть ли способ сохранить необходимые коммиты (желательно, не сохраняя всю историю библиотеки)?