Параллельные процессы git, работающие в одном репозитории - PullRequest
0 голосов
/ 06 февраля 2019

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

  1. Можно ли параллельно запускать несколько команд только для чтения (например, git log, git show, git status)?
  2. Будут ли они действительно выполняться одновременно (т.е. есть ли внутренняя блокировка?сериализация доступа)?
  3. Что делать, если выполняется модифицирующая команда?Будет ли он правильно сериализован?

1 Ответ

0 голосов
/ 06 февраля 2019
  1. Можно ли параллельно запускать несколько команд только для чтения ...

Да.К сожалению, список команд, которые на самом деле доступны только для чтения, удивляет: в частности, git status не входит в их число.Точнее, git status только для чтения, если вы запускаете git --no-optional-locks status.(Все команды могут быть выполнены таким образом, хотя --no-optional-locks влияет только на необязательные блокировки в любом случае, поэтому ничего не делает для других команд.)

Действительно ли они будут выполняться одновременно (т. Е. Существует ли внутренняя блокировка, сериализующая доступ)?

В основном, но см. (1).

Что делать, если выполняется модифицирующая команда?Будет ли он сериализован должным образом?

Определить "правильно".

Команды, которые вносят изменения, блокируют друг друга, но команды, которые сталкиваются с проблемами блокировки, как правило, обязательно .Таким образом, если две команды Git пытаются получить index.lock для обновления индекса, одна выигрывает и продолжает, другая проигрывает и полностью завершается.Это "правильно"?Репозиторий остается без изменений, но одна из команд действительно никогда не выполнялась.

Операции, доступные только для чтения, обычно видят либо состояние «до», либо состояние «после», но у них есть потенциал, чтобы их увидетьсмешанное состояние.Например, git log может считывать шесть имен ссылок последовательно, в то время как некоторые другие команды обновляют некоторые из них.В этом случае git log может получить одно или несколько «старых» значений и одно или несколько «новых» значений для каждого ссылочного имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...