Bitbucket: удалить папку из истории Git

При размещении Git в Bitbucket существует жесткое ограничение в 2 ГБ - если оно превышено, у вас есть доступ только для чтения к хранилищу. Например, чтобы предотвратить это, вы можете задним числом удалить большие папки или файлы из ваших коммитов. Но также и в других случаях (если данные доступа вошли в историю, или node_modules снова проскользнули на master), вам придется ретроспективно манипулировать историей Git вопреки ее природе.


Bitbucket написал подробную статью по этому вопросу. Чтобы пройти через все это в одном случае, мы сначала создаем новый репозиторий:

история битбакета чистая

Затем мы клонируем репозиторий в пустую папку на локальной машине:

6ab7686fc508ce87c52b10bb5d01ee51

Теперь мы создаем две подпапки с файлами случайного контента:

6ab7686fc508ce87c52b10bb5d01ee51

Сейчас мы нажимаем на мастера:

6ab7686fc508ce87c52b10bb5d01ee51

Теперь мы почти достигли жесткого ограничения в 2 ГБ на Bitbucket:

история битбакета чистая

Мы также можем проверить это локально (см. «Size-pack»):

6ab7686fc508ce87c52b10bb5d01ee51

история битбакета чистая

Задача теперь состоит в том, чтобы задним числом удалить «foo» из хранилища, чтобы уменьшить его размер вдвое. Для этого мы сначала отредактируем текущий HEAD и запишем папку в gitignore:

6ab7686fc508ce87c52b10bb5d01ee51

Наконец, мы удаляем папку, используя BFG Repo Cleaner (BFG требует текущего JRE в системе как системное требование):

6ab7686fc508ce87c52b10bb5d01ee51

Теперь мы видим результат локально:

6ab7686fc508ce87c52b10bb5d01ee51

история битбакета чистая

Однако размер хранилища еще не изменился в Bitbucket, поскольку сборщик мусора еще не был выполнен удаленно, а bitbucket не выполняет «git gc» при каждом нажатии:

история битбакета чистая

Поддержка также подтверждает это:

история битбакета чистая

Поэтому лучше всего отправить запрос напрямую на support@bitbucket.org, чтобы вручную запустить «git gc» в хранилище. Через некоторое время служба поддержки также сделала это:

история битбакета чистая

Если вы теперь перетащите хранилище «заново» на другой компьютер, на диске останется только 0,9 ГБ. Если у кого-то есть локальная версия объемом 1,8 ГБ, достаточно «git pull» и «git gc».

Назад