当前位置: 首页 > 面试题库 >

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

汪正雅
2023-03-14
问题内容

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

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

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

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

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

谢谢
亚历克斯

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

更新:

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

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

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

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

更新2:

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


问题答案:

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

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

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

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



 类似资料:
  • 我正在制作一个soundboard应用程序,当长按按钮1时,我需要共享sound1。我可以用以下代码创建共享菜单: 我可以与whatsapp和Google Drive完美共享音频文件,但其他应用程序不起作用。我听说您必须将文件复制到外部存储,并从那里共享它们。我已经搜索了将近两天,但我找不到这样做的方法。Stack上的其他文章也帮不了我:/ 如何在外部存储器中创建目录,将文件(sound1.ogg

  • 是否有任何方法(内置或附加)加密存储库中的单个文件,可供有限的人访问。这些人签入时的文件将在签出时自动加密和解密。如果其他人试图访问,它们将保持加密。

  • 问题内容: jenkins中的共享库文件在作业开始时加载,它存储在哪里?我正在尝试访问存储在共享库中的dockerfile,我需要在dockerbuild命令中提供的路径。有什么办法可以找出共享库文件在jenkins中的装载位置? 问题答案: 如果共享库是从SCM加载的,并且您的工作空间路径是,则将签出到或类似副本(如果该路径被另一个并发构建占用,则可能后缀数字)。 ,如果我理解正确,您是否不想在

  • 问题内容: 我想知道在检查代码时是否应该在回购中跟踪node_modules或进行npm安装? 问题答案: 答案并不像阿尔贝托·扎卡尼(Alberto Zaccagni)所建议的那样容易。如果您开发应用程序(尤其是企业应用程序),则在git repo中包含node_modules是一个可行的选择,您选择哪种选择取决于您的项目。 因为他非常反对node_modules,所以我将集中讨论它们的参数。

  • 我有一个经过验证的谷歌客户端,我想列出其他人公用文件夹中的文件(我认为共享或不共享的文件夹是不相关的,因为它是公用的) 这是我在NodeJS中的代码 注意:文档中没有“folderId”选项:https://developers.google.com/drive/api/v3/reference/files/list-只是一个drivid选项 虽然我将corpa设置为“drive”和drive I

  • 我正在尝试传递一个位于我的应用程序的res/raw目录中的图像以及共享意图。 我遵循了FileProvider文档中描述的流程,下面是我的代码: Androidanifest.xml 我的活动中的代码: 由于无法访问我在其他应用程序中获取的文件,因此上述操作无效: java.io.FileNotFoundException:FILE_PATH:打开失败: EACCES(权限拒绝) 知道我做错了什么