Мне нужно было прочитать несколько ответов и другую информацию, чтобы понять, что я делаю.
1.Игнорировать все, что старше определенного коммита
Файл .git/info/grafts
может определять поддельных родителей для коммита.Строка с просто идентификатором коммита говорит, что у коммита нет родителя.Если мы хотим сказать, что мы заботимся только о последних 2000 коммитах, мы можем набрать:
git rev-parse HEAD~2000 > .git/info/grafts
git rev-parse дает нам идентификатор коммита 2000-го родителя текущего коммита.Приведенная выше команда перезапишет файл трансплантатов, если он присутствует.Проверьте, есть ли он там первым.
2.Переписать историю Git (необязательно)
Если вы хотите сделать этого привитого поддельного родителя реальным, выполните:
git filter-branch -- --all
Он изменит все идентификаторы коммитов.Каждую копию этого хранилища необходимо принудительно обновлять.
3.Очистить дисковое пространство
Я не выполнил шаг 2, потому что я хотел, чтобы моя копия оставалась совместимой с исходной версией.Я просто хотел сэкономить место на диске.Чтобы забыть все старые коммиты:
git prune
git gc
Альтернатива: мелкие копии
Если у вас есть мелкая копия другого хранилища и вы просто хотите сохранить дискпробел, вы можете обновить .git/shallow
.Но будьте осторожны, чтобы ничто не указывало на коммит из ранее.Таким образом, вы можете запустить что-то вроде этого:
git fetch --prune
git rev-parse HEAD~2000 > .git/shallow
git prune
git gc
Запись в мелкой работает как трансплантат.Но будьте осторожны, чтобы не использовать трансплантаты и мелкие одновременно.По крайней мере, там нет таких записей, это приведет к ошибке.
Если у вас все еще есть старые ссылки (теги, ветви, удаленные заголовки), которые указывают на более старые коммиты, они не будут очищеныи вы не сэкономите больше места на диске.