一尘不染

网络共享文件夹上的GIT存储库中的并发

linux

我想在(Windows)网络共享上存储一个裸露的git存储库。我使用linux,并通过CIFS挂载了上述网络共享。我的同事使用Windows
XP,并将网络共享自动挂载(从ActiveDirectory以某种方式)作为网络驱动器。

我想知道是否可以在两台计算机上都使用回购协议,而不会出现并发问题。

我已经测试过了,最终我可以克隆ok,但是我担心如果我们同时访问同一个仓库(推/拉)会发生什么。

在git FAQ中,有关于使用网络文件系统的参考(以及SMBFS的一些问题),但是我不确定网络/服务器/ windows /
linux是否完成任何文件锁定-我很确定没错

那么,有没有人在没有服务器且没有问题的情况下在网络共享上使用git repo?

谢谢
亚历克斯

PS:我想避免使用http服务器(或git-
daemon),因为我无权访问共享服务器。另外,我知道我们可以将一个推/拉到另一个,但是出于备份的原因,我们必须在共享上有代码/存储库。

更新:

我担心的不是网络故障的可能性。即使这样,我们也可以在本地拥有所需的分支,并且可以编译源代码。

但是,我们通常会经常进行提交,并且需要经常进行基础调整/合并。从我的角度来看,最好的选择是在共享上有一个中央存储库(这样可以确保备份),我们都将从该存储库中克隆文件,并使用它来进行基准调整。

但是,由于我们经常这样做,因此担心 文件/存储库损坏 ,如果碰巧我们同时推/拉。通常,每次访问远程存储库时我们都可以 大喊大叫
:),但是最好由计算机/网络保护它。

而且,GIT可能有一个内部机制来执行此操作(因为有人在工作时可以推送到您的存储库中),但是我还没有发现任何结论。

更新2:

共享驱动器上的存储库将是 裸存储 库,不包含工作副本。


阅读 410

收藏
2020-06-02

共1个答案

一尘不染

Git需要最少的文件锁定,我认为这是在网络文件系统上使用这种共享资源时出现问题的主要原因。之所以可以避免这种情况,是因为Git存储库中的大多数文件-
所有构成对象数据库的文件-都被命名为其内容的摘要,并且一旦创建便是不可变的。因此,不会出现两个客户端尝试将同一文件用于不同内容的问题。

对象数据库的另一部分比较棘手-引用存储在“ refs”目录(或“ packed-
refs”)下的refs/*文件中,并且确实发生了变化:尽管文件很小,并且总是被重写而不是被编辑。在这种情况下,Git将新引用写入临时的“
.lock”文件,然后在目标文件上重命名。如果文件系统遵守O_EXCL语义,那是安全的。即使没有,最糟糕的情况可能是比赛覆盖了ref文件。尽管遇到这种情况很烦人,但它不会造成这种破坏:您可能会推送到共享存储库,并且推送看起来好像成功了,而实际上是别人成功了。但这可以简单地通过拉(合并到另一个人的

总而言之,我认为回购协议的损坏在这里并不是太大的问题-的确,由于锁定问题,事情可能会出错,但是Git回购协议的设计将使损害最小化。

(免责声明:从理论上讲,这一切听起来不错,但是我并没有同时进行仓库测试以测试它,只能在NFS而非CIFS上共享它们)

2020-06-02