http://pastebin.com/3NAQKEz9
ользовал расширение 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 <[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 в текущий репо, раздавить его в отдельный коммит, а затем добавить этот коммит в рабочую ветку. История коммитов 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', тогда все будет работать, однако это приведет к тому, что в мою репо будет вставлена куча несвязанной истории. Есть ли какой-нибудь способ сохранить необходимые коммиты (желательно без сохранения всей истории библиотеки)?