Мені потрібно було прочитати кілька відповідей та іншу інформацію, щоб зрозуміти, що я роблю.
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
.