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

时间:2019-02-06 08:32:32

标签: git concurrency

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

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

1 个答案:

答案 0 :(得分:2)

  
      
  1. 有几个并行运行的只读命令可以吗?
  2.   

是的。不幸的是,这些命令实际上是只读的列表令人惊讶:特别是git status并不是其中之一。更准确地说,只有运行git statusgit --no-optional-locks status才是只读的。 (尽管--no-optional-locks只会影响 optional 锁定,所以所有命令都可以这种方式运行,因此对其他命令则无效。)

  
      
  1. 它们是否真正同时执行(即是否有内部锁序列化访问)?
  2.   

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

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

定义“适当”。

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

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

相关问题