Я использовал расширение git-subtree ( https: // github. com / apenwarr / git-subtree ) для управления подпроектами в нашем основном проекте. Он делает именно то, что я хочу, кроме того факта, что он терпит неудачу, когда я пытаюсь отделить изменения, внесенные в подпроект, из нашего основного проекта.
например, ранее я сделал
git subtree add -P Some/Sub/Dir --squash git@gitserver:lib.git master
, чтобы внести код библиотеки в Some / Sub / Dir в нашем основном проекте. Здесь все прошло отлично, поэтому я внес свои изменения в наш центральный основной проект, в репозиторий git. Затем я решаю внести изменения в свою локальную версию библиотеки в Some / Sub / Dir, зафиксировать ее, затем разделить, чтобы вернуть ее в репозиторий lib.git
git subtree split -P Some/Sub/Dir -b some_branch
, все работает, как ожидалось. Мне больше не нужна локальная копия репо, я удалил ее.
После клонирования новой копии репо из нашего центрального репо я внес некоторые изменения в библиотеку в Some / Sub / Dir и решил, что хочу разделить эти изменения и отправить их обратно в репозиторий lib.git. Я пытаюсь использовать ту же команду разделения поддерева, что и раньше, однако на этот раз получаю следующий результат:
1/ 3 (0)
2/ 3 (1)
3/ 3 (1)
fatal: bad object d76a03f0ec7e20724bcfa253e6a03683211a7bb1
d76a03f0ec7e20724bcfa253e6a03683211a7bb1 происходит от того, когда я добавил поддерево:
commit 43b3eb7d69d5eb64241eddb12e5bd74fd0215083
Author: Ian Bond
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 в текущее репо, сжать его в отдельный коммит, а затем добавить этот коммит в рабочую ветку. Библиотека lib. История коммитов git остается в текущем репо, однако они являются висячими коммитами, поскольку на них фактически нет ссылок, кроме как через текст сквош-коммита. Пока остаются эти висячие коммиты, git-subtree может использовать их для выполнения разбиения, однако, поскольку push или pull не содержат висячих объектов (или если я запускаю gc и полностью удаляю висячие объекты), эти висячие коммиты теряются и git-subtree больше не имеет необходимой информации для выполнения разделения.
Я добавил сценарий , который полностью воспроизводит проблемы, которые у меня были.
Мои вопросы:
1) Что я могу сделать, чтобы справиться с существующей ситуацией, когда у меня теперь есть поддеревья, которые я хочу слить обратно в их исходное репо, но больше не имеют какой-либо истории, связывающей их вместе. Моя текущая мысль - сделать что-то вроде:
git subtree split -P Some/Sub/Dir 43b3eb7^.. --ignore-joins -b splitBranch
, чтобы разделить всю историю, начиная с 'git subtree add', и объединить ее обратно в исходное репо (которое, к счастью, не претерпело никаких изменений с момента добавления). Это лучший способ пойти? Есть какие-нибудь рекомендации по выполнению слияния?
2) Могу ли я что-нибудь сделать, чтобы git-subtree работал должным образом? Я считаю, что если я опущу параметр --squash в 'git subtree add', тогда все будет работать, однако это приведет к тому, что в мое репо будет добавлена куча несвязанной истории. Есть ли способ сохранить необходимые коммиты (желательно без сохранения всей истории библиотеки)?