【问题标题】:Concurrent git processes working on single repository在单个存储库上工作的并发 git 进程
【发布时间】:2019-02-06 08:32:31
【问题描述】:

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

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

【问题讨论】:

    标签: git concurrency


    【解决方案1】:
    1. 可以并行运行多个只读...命令吗?

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

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

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

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

    定义“正确”。

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

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

    【讨论】:

    • “正确”是指写入操作发生在读取操作之前或之后,但不在中间(因此读取看到“之前”或“之后”而不是“中间”状态)。我也在考虑一种读写锁,其中可以并行发生多个读取,但写入需要独占访问。
    • Git 绝对不会这样做——读者可以阅读锁定的项目。 (他们只会看到旧值。)锁定通常用于重写索引和/或引用。对象和打包对象是只写的,在临时文件中构造并重命名。
    猜你喜欢
    • 2013-10-31
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多