我想在(windows)网络共享上存储一个裸git存储库。我使用linux,并使用CIFS安装所述网络共享。我的coleague使用windows xp,并将网络共享自动挂载(从ActiveDirectory,以某种方式)作为网络驱动器。
我想知道我是否可以使用两台计算机上的repo,没有并发问题。
我已经测试了,在我的结尾我可以克隆好,但我担心如果我们同时访问相同的回购(推/拉)会发生什么。
在git FAQ中有关于使用网络文件系统的参考(以及SMBFS的一些问题),但我不确定网络/服务器/ windows / linux是否有任何文件锁定 - 我很确定没有。
那么,有没有人在网络共享上使用git repo,没有服务器,没有问题?
谢谢你,
亚历
PS:我想避免使用http服务器(或git-daemon),因为我没有访问带有共享的服务器。此外,我知道我们可以从一个推送/拉到另一个,但我们需要在备份原因上拥有代码/ repo。
更新
我担心的不是网络故障的可能性。即便如此,我们也会在本地拥有所需的分支,并且我们将能够编译我们的资源。
但是,我们通常会经常提交,并且需要经常进行rebase / merge。从我的角度来看,最好的选择是在共享上设置一个中央存储库(这样可以确保备份),我们将从该存储器中克隆,并使用它进行重组。
但是,由于我们经常这样做,我担心文件/ repo损坏,如果碰巧我们同时推/拉。通常情况下,每次我们访问远程仓库时,我们都会互相喊叫,但最好还是让计算机/网络保护它。
而且,GIT可能有一个内部机制来执行此操作(因为有人可以在你工作的时候推送你的一个回购),但我还没有找到任何结论。
更新2:
共享驱动器上的仓库将是裸仓库,不包含工作副本。
答案 0 :(得分:43)
Git需要最小的文件锁定,我认为这是在网络文件系统上使用这种共享资源时出现问题的主要原因。它可以逃脱的原因是Git repo中的大多数文件 - 所有形成对象数据库的文件 - 被命名为其内容的摘要,并且一旦创建就不可变。因此,有两个客户端尝试将不同内容用于同一文件的问题没有出现。
对象数据库的另一部分比较棘手 - 引用存储在“refs”目录下的文件中(或“packed-refs”中)并且这些内容确实发生了变化:尽管refs/*
文件很小并且总是重写而不是被编辑。在这种情况下,Git将新的ref写入临时的“.lock”文件,然后将其重命名为目标文件。如果文件系统尊重O_EXCL
语义,那就安全了。即使不是,最糟糕的情况可能是比赛覆盖ref文件。虽然这对于遇到会很烦人,但它不应该导致腐败:它可能就是你推送到共享仓库的情况,而这种推动看起来就像是成功了,而实际上是其他人做的。但这可以简单地通过拉动(合并另一个人的提交)并再次推动来解决。
总而言之,我不认为回购损坏在这里是一个太大的问题 - 由于锁定问题,事情可能会出现一些错误,但Git回购的设计将最大限度地减少损害。
(免责声明:理论上这一切听起来都不错,但是我没有同时敲击一个回购来测试它,只能通过NFS共享它们而不是CIFS)
答案 1 :(得分:7)
为什么要这么麻烦? Git旨在分发。只需在每台计算机上都有一个存储库,并使用发布和拉取机制在它们之间传播您的更改。
出于备份目的,运行夜间任务以将存储库复制到共享。
或者,在共享上创建一个存储库并从中完成工作,但将它们用作分布式存储库,您可以从中相互提取变更集。如果您使用此方法,那么执行构建等的性能将会降低,因为您将不断通过网络进行访问。
或者,在您自己的计算机上分发存储库,并运行定期任务将您的提交推送到共享上的存储库。
答案 2 :(得分:5)
显然支持使用中央git repo。大多数规定的用途表示ssh或http访问,两者都不能避免同时访问repo。即使您正在进行完全分布式使用,如果两个以上的协作者在任何地方推送到同一个repo,也会出现这个问题。到目前为止,没有回应回答这个问题。 git的设计是否允许它同时处理N个分支?
答案 3 :(得分:-2)
听起来好像您更喜欢使用集中式版本控制系统,因此对备份的查询很满意。 也许在xxx2git之间让你在本地工作。