Я экспериментировал с использованием git поддерева и столкнулся со следующей ситуацией.
Я использовал поддерево git для добавления внешнего проекта в репозиторий, я намеренно сохранил всю историю для вышестоящего проекта, так как хочу иметь возможность ссылаться на историю проекта, а также вносить свой вклад в последующий проект позже.
Оказывается, другой участник вышестоящего проекта случайно поместил большой файл в основную ветку. Чтобы это исправить, вышестоящий проект переписал историю и принудительно перенес на мастер. При создании моего "monorepo" я включил этот коммит, и я также хотел бы удалить его.
Как я могу обновить свой репозиторий, чтобы отразить новую историю поддерева?
Моей первой попыткой было использование filter-branch для полного удаления поддерева и всей истории.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD
Как только старая версия поддерева была удалена, я мог бы повторно добавить поддерево, используя новый основной канал восходящего потока. Однако это не сработало, потому что по какой-то причине история коммитов по-прежнему отображается в выходных данных журнала git.
Обновить
Я написал шаги, чтобы создать минимально воспроизводимый пример.
Сначала создайте пустой репозиторий git.
git init test-monorepo cd ./test-monorepo
Создайте начальный коммит.
echo hello world > README git add README git commit -m 'initial commit'
Теперь добавьте поддерево для внешнего проекта.
git remote add thirdparty git@github.com:teivah/algodeck.git git fetch thirdparty git subtree add --prefix algodeck thirdparty master
Сделай коммит на монорепо
echo dont panic >> algodeck/README.md git commit -a -m 'test commit'
Теперь попытайтесь использовать git filter-branch для удаления поддерева.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch algodeck' --prune-empty HEAD
Проверьте вывод журнала git, я ожидаю увидеть только мой начальный коммит.
git log
git gc --prune=now
удалять только коммиты, которые не отображаются в git log
?
git log
, без аргументов, и я все еще вижу старые коммиты.