本地 Git 存储库线程安全吗?

Ber*_*ach 5 git race-condition

如果两个用户同时尝试使用存储库,是否可以保证本地 Git 存储库没有竞争条件?

假设 Linux 系统上的两个用户git commit同时运行,或者一个用户正在应用补丁而另一个用户正在尝试检出分支,在这种情况下 Git 的行为是否明确定义?

bk2*_*204 7

Git 使用锁定和原子重命名来避免.git目录中的数据损坏问题。因此,例如,可以git gc在执行其他操作的同时继续进行,并且不会丢失任何数据,也不会在任何时候存储库出现损坏或丢失对象。尽管如此,某些并发操作(例如,更新索引)仍有可能由于对锁的争用而中止。

然而,话虽如此,工作树并不能保证没有种族。例如,没有用目录替换文件的原子方法,因此git checkout不会尝试原子化。同样,在结帐期间应用补丁可能会导致数据丢失或意外故障。

如果您需要让多个程序使用同一个存储库,请考虑使用裸存储库和 libgit2 之类的东西或其特定语言的包装器之一。这将使您更轻松地创建多个分支和提交,而无需争夺工作树。

如果您需要多个人类用户来使用存储库,您应该使用存储库的多个副本。用户不会喜欢共享一个工作树,如果两个人同时使用一个,你会遇到实际问题。此外,Git 的安全模型不允许恶意用户通过传输协议以外的方式共享存储库;例如,自动调用的钩子可以执行任意代码。即使是非恶意用户也可能希望使用自定义钩子或其他配置(例如,.git/info/exclude),从而使共享存储库变得不可取。