repack -ad
: удалить список мелких коммитов
git repack
может отбрасывать недоступные коммиты без дальнейшего предупреждения,
делая соответствующие записи в .git/shallow
недействительными, что вызывает
серьезные проблемы при углублении веток.
Один сценарий, когда недоступные коммиты сбрасываются на git repack
, это
когда git fetch --prune
(или даже git fetch
, когда ссылка была
тем временем) может сделать коммит недостижимым, что было
достижимы до.
Поэтому небезопасно предполагать, что git repack -adlf
будет хранить недоступные коммиты в одиночку (при условии, что они не были упакованы в первую очередь, что является предположением, которое, по крайней мере, делает некоторый код Git).
Это особенно важно учитывать при взгляде на
.git/shallow
file: если какие-либо коммиты, перечисленные в этом файле, становятся
недоступно, это не проблема, но если они пропадают, это равно a
проблема.
Одним из симптомов этой проблемы является то, что углубление может теперь
ошибка с:
fatal: error in object: unshallow <commit-hash>
Чтобы избежать этой проблемы, давайте удалим неглубокий список в git repack
при передаче опции -d
, если только не передана также -A
(что заставило бы теперь недоступные объекты превратиться в свободные объекты быть удаленным).
Кроме того, нам также необходимо учитывать --keep-reachable
и --unpack-unreachable=<date>
.
Примечание: альтернативное решение обсуждалось во время обзора этого патча
должен был научить git fetch
просто игнорировать записи в .git/shallow
, если
соответствующие коммиты не существуют локально.
Тем не менее, быстрый тест показал, что файл .git/shallow
записывается во время мелкого клона 1062 *, и в этом случае коммиты тоже не существуют, но есть "мелкая" строка
нужно отправить.
Следовательно, этот подход был бы намного более привередливым, чем подход, представленный этим патчем.