Подтвердить что ты не робот

Безопасно ли, если несколько команд git запускаются на одном и том же репо параллельно?

Мне интересно, можно ли параллельно запускать такие вещи, как git push и git commit (например, в заданиях cron, jenkins jobs и т.д.). Есть ли встроенный механизм блокировки в git, чтобы эти операции были сериализованы или это может повредить репозиторий?

4b9b3361

Ответ 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"));