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