git-subtree не сохраняет историю, поэтому я не могу вносить изменения в поддерево, как я могу это исправить / избежать эта проблема в будущем?

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

16
задан Tom Anderson 23 April 2011 в 12:24
поделиться