Git有各种读/写内部数据库的操作。我已经读过Git中的写操作是原子的。但是,对于读取等其他操作,哪些操作会锁定数据库?
具体来说,我正在编写一个同时调用“git blame”的应用程序,我想确保这是我可以多线程的东西。
答案 0 :(得分:1)
我没有在源代码中检查这个,但是从了解git的内部结构,我会说除了git gc
之外的所有内容都可以是多线程的。
Git只是一堆相互引用的目标文件,但只允许在一个方向上引用(“过去”)。除了分支头之外,git存储库的内容无法修改(仅扩展),git gc
是唯一可以从git存储库中删除内容的操作。
这就是为什么git需要绝对最小锁定,以及为什么你应该没问题。请注意,索引除了所有这些之外 - 它将经常被锁定,但是git blame HEAD
并且您将在裸存储库上运行的每个命令都不使用索引。
答案 1 :(得分:1)
确实需要最小的锁定。
唯一需要注意的是同时运行几个 git gc
,commit ed7eda8由Kyle 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
命令而不会出现任何问题。