Удалить историю из огромного Git репозитория - PullRequest
1 голос
/ 05 августа 2020

Я сейчас пытаюсь уменьшить размер моего Git репозитория , но столкнулся со многими проблемами.

Введение

У меня огромный и сложный репозиторий Git, содержащий тысячи коммитов и более десяти веток. Его текущий размер превышает 2 ГБ.

Что я хочу сделать

Я хотел бы очистить историю репозитория , чтобы уменьшить его размер как можно больше. Я выбрал специальную фиксацию, которая должна быть моей новой root фиксацией (назовите ее <NEW_ROOT>); Я хочу удалить каждую фиксацию до <NEW_ROOT> и сохранить все коммиты после .

Я хочу сохранить только master и, возможно, develop веток , любая другая ветка должна быть удалена из истории для уменьшения размера.

В конце процедуры я хочу pu sh все на удаленное , так что обновляются только мастер и источник (в основном это должно отражать мою локальную ситуацию).

То, что я пробовал до сих пор

Я много просматривал Интернет и нашел много решений, но ни одно из них не помогло мне. В частности, я думаю, что такое решение было бы идеальным в моем случае, к сожалению, у меня было много конфликтов при перебазировании .

Я также много боролся, потому что многие Найденные мной решения относятся к устаревшим и устаревшим инструментам / параметрам (например, git filter-branch).

Не могли бы вы помочь мне найти выход?

Большое спасибо!

1 Ответ

2 голосов
/ 05 августа 2020
• 1000 прочь. [...] Это иногда полезно, когда вас интересует только недавняя история проекта, даже если реальная история, записанная в восходящем потоке, намного больше. локальный репозиторий в новый каталог , начиная с из коммита, который вы считали новым root. Обратите внимание, что это решение предполагает, что вас интересует только сохранение одной ветки в новом репозитории (например, master).

Первое, что вам нужно сделать, это создать ветку ссылка, указывающая на родительский из <NEW_ROOT> в существующем репозитории:

cd your-large-repo
git branch new-root <NEW_ROOT>^

Мы будем использовать new-root как точку отсечения для мелкий клон. Поскольку мы действительно хотим включить <NEW_ROOT> в новый репозиторий, мы устанавливаем точку отсечения для его родителя. Конечно, <NEW_ROOT> должен быть доступен из master.

На этом этапе вы можете go вперед и клонировать свой локальный репозиторий в новый каталог, указывающий, что:

  1. Вас интересует только ветка master
  2. Вы хотите исключить все коммиты, доступные из new-root

Вот полная команда:

git clone --branch master --shallow-exclude=new-root file://C:\path\to\your-large-repo C:\path\to\your-new-repo

Параметр --shallow-exclude - это то, что сообщает Git исключить все коммиты, ведущие до new-root включительно из клона.

Теперь, если вы cd перейдете в your-new-repo, вы обнаружите, что он содержит только ветку master, а фиксация root равна <NEW_ROOT>.

В новом репозитории его origin будет установлено на file://C:\path\to\your-large-repo. Итак, прежде чем вы go продолжите, вам нужно будет заменить его фактическим URL-адресом удаленного репозитория:

git remote set-url origin https://example.com/your-large-repo.git

На этом этапе вы можете просто принудительно установить pu sh новая история в удаленном репозитории (с обычным предупреждением о последствиях принудительного нажатия ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...