什么Git操作锁定数据库?

时间:2013-07-15 17:55:57

标签: git locking

Git有各种读/写内部数据库的操作。我已经读过Git中的写操作是原子的。但是,对于读取等其他操作,哪些操作会锁定数据库?

具体来说,我正在编写一个同时调用“git blame”的应用程序,我想确保这是我可以多线程的东西。

2 个答案:

答案 0 :(得分:1)

我没有在源代码中检查这个,但是从了解git的内部结构,我会说除了git gc之外的所有内容都可以是多线程的。

Git只是一堆相互引用的目标文件,但只允许在一个方向上引用(“过去”)。除了分支头之外,git存储库的内容无法修改(仅扩展),git gc是唯一可以从git存储库中删除内容的操作。

这就是为什么git需要绝对最小锁定,以及为什么你应该没问题。请注意,索引除了所有这些之外 - 它将经常被锁定,但是git blame HEAD并且您将在裸存储库上运行的每个命令都不使用索引。

答案 1 :(得分:1)

确实需要最小的锁定。

唯一需要注意的是同时运行几个 git gccommit ed7eda8Kyle J. McKay (mackyle)为Git 1.9 / 2.0(2014年第一季度)所示,实际上是Git 1.8.5.3,于2014年1月15日发布。

64a99eb4(git 1.8.5)以来,git gc拒绝在没有--force选项的情况下运行 另一个gc进程已在同一个存储库中运行。

  

但是,如果存储库已共享且用户A在存储库上运行git gc,而gc仍在运行,则用户B会在git gc上运行gc用户A运行的gc流程不会被注意到,用户B运行的kill(pid, 0)将继续运行。

     

问题是EPERM测试失败并出现B错误,因为不允许用户A发信号通知用户B拥有的进程(除非用户{{1}是} root)。

     

更新测试以识别EPERM错误,因为该过程存在且另一个gc不应运行(除非--force已给出)。

因此,除非您处于这种情况下,否则您可以同时调用其他git命令而不会出现任何问题。