在单个存储库上工作的并发 git 进程

Krz*_*iak 6 git concurrency

我正在为 git 编写一些工具(可以说它是另一个 GUI),并且我计划并行运行多个 git 命令(使用命令行客户端),因此多个进程可能随时访问存储库。

  1. 并行运行多个只读(例如 git log、git show、git status)命令可以吗?
  2. 它们真的会并发执行吗(即是否有内部锁序列化访问)?
  3. 如果执行了修改命令怎么办?它会被正确序列化吗?

tor*_*rek 5

  1. 并行运行多个只读...命令可以吗?

是的。不幸的是,实际上只读的命令列表令人惊讶:特别是,git status不是其中之一。更准确地说,git status只有在运行时才是只读的git --no-optional-locks status。(所有命令都可以以这种方式运行,但无论如何--no-optional-locks只会影响可选锁,因此它对其他命令没有任何作用。)

  1. 它们真的会并发执行吗(即是否有内部锁序列化访问)?

大多数情况下,但请参见 (1)。

  1. 如果执行了修改命令怎么办?它会被正确序列化吗?

定义“适当”。

进行更改的命令确实会相互锁定,但遇到锁定问题的命令往往会失败。因此,如果两个 Git 命令尝试index.lock同时更新索引,一个会获胜并继续,另一个会失败并完全退出。这是“正确的”吗?存储库保持不变,但其中一个命令从未真正运行过。

真正的只读操作通常会看到“之前”状态或“之后”状态,但它们有可能看到混合状态。例如,git log可能会连续读出六个参考名称,而其他一些命令会更新其中的一些名称。在这种情况下,git log每个参考名称可能会获得一个或多个“旧”值以及一个或多个“新”值。