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', тогда все будет работать, однако это приведет к тому, что в мою репо будет вставлена ​​куча несвязанной истории. Есть ли какой-нибудь способ сохранить необходимые коммиты (желательно без сохранения всей истории библиотеки)?

Ответы на вопрос(2)

Ваш ответ на вопрос