Мне нужно было прочитать несколько ответов и некоторую другую информацию, чтобы понять, что я делаю.
<сильный>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
Вход в неглубокие работает как трансплантат. Но будьте осторожны, чтобы не использовать прививки и мелкие одновременно. По крайней мере, если там нет одинаковых записей, это не удастся.
Если у вас все еще есть старые ссылки (теги, ветки, удаленные головки), которые указывают на старые коммиты, они не будут очищены, и вы не сэкономите больше места на диске.
person
Maikel
schedule
01.05.2017