哪些Git操作会锁定数据库?

5

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

具体而言,我正在编写一个应用程序,将同时调用“git blame”,我想确保这是我可以多线程处理的内容。

2个回答

1
我没有在源代码中检查过,但是从了解git的内部结构来看,除了git gc之外的所有内容都可以进行多线程处理。
Git只是一堆相互引用的对象文件,但是只允许单向引用(“过去”)。除了分支头之外,git仓库的内容不能被修改(只能扩展),而git gc是唯一会从git仓库中删除内容的操作。
这就是为什么git需要绝对最小化的锁定,并且你应该没问题的原因。请注意,索引除外 - 它将经常被锁定,但git blame HEAD和您在裸库上运行的每个命令都不使用索引。

1

确实需要最小化锁定。

唯一需要注意的是当同时运行多个 git gc 时,就像提交ed7eda8Kyle J. McKay (mackyle)为Git 1.9/2.0 (Q1 2014)所示,实际上是在2014年1月15日发布的Git 1.8.5.3。

自从64a99eb4(git 1.8.5)以来,如果同一仓库中已经运行了另一个gc进程,则git gc将拒绝运行,除非使用--force选项。

然而,如果仓库是共享的,并且用户A在仓库上运行git gc,而当gc仍在运行时,用户B在同一仓库上运行git gc,则不会注意到由用户A运行的gc进程,用户B运行的gc将继续运行。 问题在于kill(pid, 0)测试失败并显示EPERM错误,因为除非用户B是root,否则不允许用户B信号化由用户A拥有的进程。 更新测试以将EPERM错误识别为意味着进程存在并且不应再运行另一个gc(除非给出--force)。 因此,除非您处于该情况下,否则可以同时调用其他git命令而不会出现任何问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接