Мне интересно, можно ли параллельно запускать такие вещи, как git push
и git commit
(например, в заданиях cron, jenkins jobs и т.д.). Есть ли встроенный механизм блокировки в git, чтобы эти операции были сериализованы или это может повредить репозиторий?
Безопасно ли, если несколько команд git запускаются на одном и том же репо параллельно?
Ответ 1
Да. Git работает, записывая ссылки таким образом, который позволяет это. Если вы совершаете фиксацию одновременно с нажатием, push будет только перейти от ссылок вниз к содержащимся в них объектам. Если фиксация завершается и обновляет ссылку на ветку вовремя, она будет нажата. Если этого не произойдет, старая ссылка будет нажата. Вы не получите "половину фиксации".
Все файлы записываются таким образом, что неявно сохраняет ссылочную целостность для любых указателей. Последний записанный файл будет ссылкой, в которой уже есть все его зависимости.
Ответ 2
В теории может быть редкий случай состояния гонки для части git commit
, где файл HEAD
недоступен.
Это было тихо до Git 2.15.x/2.16 (Q1 2018). Он больше не будет молчать.
Смотрите совершить c26de08 (20 октября 2017 г.) Андрей Окошкин ( ``).
(слияние Junio C Hamano - gitster
- в commit 4a1638c, 06 ноября 2017 г.
commit
: проверить результат resolve_ref_unsafeДобавьте проверку разрешенной ссылки HEAD во время печати сводки фиксации.
resolve_ref_unsafe()
может возвращать указательNULL
, если базовые вызовыlstat()
илиopen()
терпят неудачу вfiles_read_raw_ref()
.
Такая ситуация может быть вызвана расой: файл становится недоступным до этого момента.
Сообщение будет:
if (!head)
die_errno(_("unable to resolve HEAD after creating commit"));