Мне было интересно сегодня, насколько хорошо git обеспечивает целостность своих метаданных, и я немного удивлен тем, с чем столкнулся. Я использовал следующую простую настройку для тестирования:
- Два рабочих репозитория, называемые
x
иy
- Пустой репозиторий, называемый
xy.git
Итак, изначально x
и y
выдвигаются и извлекаются из x.git
и все работает просто отлично. Теперь предположим, что один из объектов метаданных (.git/objects/...
) в x.git
по какой-либо причине поврежден (выберите ваш любимый случайный случай).
Я на самом деле предполагал, что что-то сломается при следующем толчке или толчке, но, к моему удивлению, все оказалось нормально. Больше коммитов, больше толкающих и тянущих, никаких проблем. Первый раз что-то было повреждено, когда я попытался клонировать другой рабочий репозиторий из чистого репозитория, оставив мой клон в непригодном для использования состоянии.
Теперь я подумал, что это не так уж и плохо, потому что благодаря архитектуре git я могу просто сбросить пустой репозиторий в худшем случае и воссоздать его со всей историей из одного из моих рабочих наборов. Но нет. Без какого-либо уведомления испорченный файл пробирается через рабочие репозитории, что делает невозможным клонирование нового голого репозитория из них.
Это происходит не только тогда, когда я начинаю с поврежденного файла в пустом хранилище, но и таким образом можно представить поврежденный файл из рабочего хранилища в пустом.
Конечно, можно было бы исправить это другими способами, но я все еще удивлен (и немного обеспокоен), насколько легко оказывается испортить хранилище для всех, кто с ним работает. Тем более что ошибка может остаться незамеченной до следующего раза, когда кто-то попытается клонировать. Разве не должно быть чеков против этого где-нибудь?
Кто-нибудь здесь хочет попробовать, если это воспроизводимо? Я экспериментировал с git-версией 2.7.4.
Любые советы о том, как противостоять такой коррупции, очень приветствуются.