Мне нужно было прочитать несколько ответов и другую информацию, чтобы понять, что я делаю.
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
Запись на мелководье работает как прививка. Но будьте осторожны, чтобы не использовать трансплантаты и мелкие одновременно. По крайней мере, там нет одинаковых записей, это не удастся.
Если у вас все еще есть старые ссылки (теги, ветви, удаленные заголовки), которые указывают на более старые коммиты, они не будут очищены и вы не сэкономите больше дискового пространства.
git filter-branch --tag-name-filter cat -- --allчтобы обновить теги. Но у меня также есть старые теги, указывающие на старую историю, которую я хочу удалить. Как я могу избавиться от всех этих старых тегов? Если я не удаляю их, то старая история не исчезает, и я все еще могу видеть ееgitk --all.