Насколько устойчивы коммиты Git при отключении питания?

24

Однажды я использовал Git (я все еще использую его), и электричество отключилось, когда я делал коммит.

Когда я (на самом деле, электричество) вернулся, репозиторий был испорчен. Я не помню точное имя, но это было что-то вроде «недействительные ссылки» или что-то в этом роде.

Легко догадаться, что фиксация была нарушена в середине операции (я делал коммит через IntelliJ, который выполняет автоматическое добавление индекса). Также было легко догадаться, что на самом деле 'commit' не такой ACID, как операция с СУБД с тем же именем.

Q : Есть ли способ гарантировать, что операции репо изменяют атомарность? то есть, если электричество снова отключается, и я фиксирую, я бы хотел, чтобы моя файловая система не была в поврежденном состоянии.

Луис Масуэлли
источник
10
Купить ИБП? .....
Роберт Харви
сделать ежедневную резервную копию?
чокнутый урод
Это не решает проблему - представьте, что git-репозиторий находится на сервере, а я PUSH из локального репозитория, и во время ассимиляции коммита на сервере энергия снова снижается. Та же проблема, но на этот раз без присутствия человека.
Луис Масуэлли

Ответы:

10

Я не знаю, есть ли способ заставить коммиты Git пережить точно рассчитанные сбои питания, но вы можете исправить свой репозиторий.

Предполагается, что объекты Git являются неизменяемыми, поэтому все ваши старые коммиты должны быть действительными. В соответствии с этим ответом вы можете изменить хэш, .git/refs/heads/<branch-name>чтобы изменить заголовок ветви, над которой вы работали, на предыдущий коммит (вы можете увидеть их в .git/logs/HEAD).

В комментарии к этому ответу говорится, что этот метод «по-прежнему оставляет хранилище в поврежденном состоянии, но это позволяет восстановить его». Я не проверял это (не знаю, как повторить вашу ситуацию), но я предполагаю, что восстановление выполняется с помощью git gc, который удалит поврежденный коммит.

Идан Арье
источник
6
"Не знаю, как воспроизвести вашу ситуацию" Выдернуть пробку? ;)
Яннис
3
@YannisRizos Может быть, если бы это был SVN, но коммиты Git слишком быстры для человеческих способностей времени ...
Идан Арье
5
Git с открытым исходным кодом, верно? Таким образом, чтобы воспроизвести проблему, создайте код, установите точку останова, прежде чем данные будут сохранены на диск, а затем отключите устройство.
Джон Сондерс
10

Система хранения Git не является транзакционной, поэтому существует определенная вероятность того, что аппаратная проблема может привести к несогласованности. С другой стороны, Git также очень быстр, поэтому вам, возможно, не повезет, если вы столкнетесь с проблемами типа «сбой питания» (систематические проблемы с диском - это что-то еще). Скорость отчасти объясняется тем, что она не транзакционная; транзакции действительно довольно дороги, так как им приходится ждать подтверждения с диска, на который они записали данные. (Базы данных делают все возможное, чтобы скрыть эту стоимость, но в конечном итоге они все равно платят. Некоторые из конкурирующих DVCS являются транзакционными, и да, они работают немного медленнее на том же оборудовании, что и git.)

В худшем случае - полный катастрофический сбой диска (который, как я видел), - единственный способ восстановления DVCS - использовать тот факт, что он распространяется, Если вы до недавнего времени перенесли свои изменения в другую систему, и они предоставили их множеству разных хостов, восстановление - это просто вопрос использования одного из этих других мест в качестве источника артефакта, места, из которого можно извлечь свои ветви ( даже если только временно). Таким образом, вы вернете историю интересных веток и сможете снова быстро начать работать; все, что уничтожает множество распределенных копий вашего репо, является либо катастрофой, когда вы не беспокоитесь о программировании впоследствии (подумайте о серьезном воздействии метеорита), либо прямым действием противника. (Постарайтесь не создавать таких врагов…) Это полностью контрастирует с нераспределенными системами, где потеря центрального сервера, на котором размещено все, является смертельным ударом.

Donal Fellows
источник
5
Если вы не продвигаете свои филиалы, не сохраняете резервные копии и не используете ИБП, вы можете винить себя только в том случае, если проблемы с оборудованием стерли все это. У вас есть инструменты ...
Донал Феллоуз
1
Нет ли какого-либо способа или плагина для обеспечения транзакций в git? Если бы существовала такая опция -или плагин, я бы не заботился о том, чтобы они (т.е. операции) были медленнее. К счастью, у меня нет проблем с оборудованием. К сожалению, энергия в этом здании часто отключается (скажем, раз в две недели получает свое собственное присутствие), и я все время кодирую, и у меня нет UPS. К счастью, я удалил (клонировал / подтолкнул) его в github. К сожалению, я теряю время на то, чтобы откатить все и повторить проект.
Луис Масуэлли
2
Частые отключения питания во время работы означают, что вы действительно увеличиваете риск повреждения файловой системы, если не повреждаете оборудование. Мне было бы интересно, почему вы не развлекаете идею приобретения ИБП, которая решит большинство описанных проблем, которые у вас возникли, и, вероятно, будет лучшим ответом.
Барт Сильверстрим