Может ли git-репозиторий быть поврежден, если команда, модифицирующая его, вылетает или прерывается? - PullRequest
11 голосов
/ 05 декабря 2011

Играя с git, я иногда пробую что-то, а затем прерываю команды, которые занимают слишком много времени (например, некоторые git svn команды, которые зависают при проблемах с сетью).Это заставило меня задуматься:

Всегда ли безопасно принудительно прерывать команду (Ctrl-C или kill)?Что делать, если команда вылетает (нехватка памяти, ошибка, проблема с сетью / FS)?Являются ли изменения в хранилище «транзакционными» в том смысле, что незавершенные изменения «откатываются» (как в файловой системе управления версиями)?Или я рискую испортить репозиторий в этом случае?

Я уверен, что умные люди, работающие над git, должны были это учитывать, но я не смог найти никакой информации в руководстве по git или в Интернете.

1 Ответ

9 голосов
/ 05 декабря 2011

Репозиторий полностью транзакционный, да.

Рабочее дерево почти транзакционно, но есть угловой случай, с которым нелегко разобраться. Checkout выполняет все необходимые проверки и записывает новое содержимое во временные файлы, и в течение этого времени ничего не изменяется, если вы прервете его. Но затем он переименовывает файлы в дерево один за другим и, наконец, обновляет ссылку на HEAD, и прерывание на этом этапе может привести к частичным изменениям в дереве. Массовое переименование не позволяет делать это атомарно.

...