2009-04-15 137 views
44

我想要在(Windows)网络共享中存储裸仓库。我使用linux,并且使用CIFS安装上述网络共享。我的coleague使用windows xp,并将网络共享作为网络驱动器自动挂载(从ActiveDirectory以某种方式)。网络共享文件夹中GIT仓库的并发性

我不知道是否可以使用两台计算机回购,没有并发问题。

我已经测试过,并在我结束我可以克隆不错,但我怕如果我们都访问相同的回购(推/拉)可能发生的事情,在同一时间。

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

那么,有没有人使用网络共享一个git回购,没有服务器,没有问题呢?

谢谢
亚历

PS:我想避免使用HTTP服务器(或git的守护进程),因为我没有访问与共享服务器。另外,我知道我们可以从一个推到另一个,但我们需要在代码/回购上进行备份。

更新:

我的担心是不是网络故障的可能性。即便如此,我们也会在当地设立必要的分支机构,我们将能够编辑我们的资源。

但是,我们平时经常犯的,需要变基/合并频繁。从我的观点来看,最好的选择是在股票上有一个中央回购(所以备份是有保证的),我们都会从这个回购克隆,然后用它来重组。

但是,由于我们经常这样做,我害怕文件/ repo损坏,如果它发生在我们同时推/拉。通常,每次我们访问远程回购时,我们都可以互相呼叫,但是最好是由计算机/网络保护它。

而且,有可能GIT有一个内部机制来做到这一点(因为有人可以把你的回购协议之一,而你在它的工作),但我没有发现任何确凿的呢。

更新2:

共享驱动器上的回购将是一个回购,不包含工作副本。

+3

谢谢你的问题亚历克斯,我面临类似的情况,这是非常有益的。需要补充的一点是:你需要确保你们两个使用的是相同版本的git,因为windows和linux的exe会在网络共享上使用相同的裸回购,理论上可以在版本之间有一些区别。可能不是,但只是你需要铭记的一面旗帜。 – 2012-01-13 17:00:08

+0

另请参阅:http://stackoverflow.com/questions/1489542/are-there-any-concurrency-issues-in-backing-up-git – 2012-11-16 07:49:50

+0

将同步用户数限制为1可能很有用,方法是转到文件夹的高级共享选项 – Omar 2013-02-14 19:29:31

回答

39

Git需要最少的文件锁定,我认为这是通过网络文件系统使用这种共享资源时出现问题的主要原因。它可以避免的原因是,Git仓库中的大部分文件---构成对象数据库的所有文件都被命名为内容的摘要,并且一旦创建就不可变。因此,有两个客户端试图为不同的内容使用同一个文件的问题没有出现。

对象数据库的其他部分更复杂 - refs存储在“refs”目录(或“packed-refs”)下的文件中,这些确实会改变:尽管refs/*文件很小并且总是可以重写而不是被编辑。在这种情况下,Git会将新引用写入临时的“.lock”文件,然后将其重命名为目标文件。如果文件系统符合O_EXCL语义,那是安全的。即使不是,可能发生的最糟糕的情况也是覆盖ref文件。尽管遇到这种情况会很烦人,但它不应该导致腐败:它可能是您推到共享回购的情况,并且推动看起来像是成功了,而实际上是其他人的做法。但是,这可以通过简单地拉(合并其他人的提交)并再次推送来解决。

总之,我认为回购腐败在这里不是太多问题 - 事实上由于锁定问题可能会出现一些问题,但Git回购的设计可以最大限度地减少损失。

(免责声明:这一切都在理论上听起来不错,但我没有做回购的任何并发锤击超过NFS不CIFS对其进行测试,并且只分享)

+0

谢谢!对于这样的一些解释我正在寻找。我会试一试,看看是否有什么不好的事情发生,我会更新这个问题。 祝您有美好的一天! – Alex 2009-04-15 11:22:46

+0

你能提供一个URL或其他更深入的内容吗?这真的很有趣 – knocte 2013-11-13 18:55:56

7

为什么要麻烦? Git旨在分发。只需在每台计算机上都有一个存储库,并使用发布和提取机制在它们之间传播更改。

出于备份目的,运行夜间任务以将存储库复制到共享。

或者,创建共享上每一个存储库,并从他们做你的工作,但把它们作为分布式资料库,从中可以相互拉动的变更。如果您使用这种方法,那么执行构建等操作将会减少,因为您将不断地通过网络访问。

或者,在您自己的计算机上分配存储库,并运行定期任务以将您的提交推送到共享上的存储库。

+0

我认为alexandrei提出的真正问题不是关于分布式特性,但是如果由于CIFS/Windows共享失败(挂载问题,断开连接等)而推送失败会发生什么。 – 2009-04-15 09:07:57

+0

我明白了,我的要点是,为什么要担心这个担心?你不需要,如果你只是使用它的设计方式的git – 2009-04-15 09:17:27

+0

我认为这里的最后一点很优雅地回答了这个问题。只要让每台电脑的回购在不同的时间自动推入分享。 – supercheetah 2009-04-15 09:25:06

-2

听起来就像您更愿意使用集中式版本控制系统一样,因此备份查询是令人满意的。 也许与xxx2git之间为你在本地工作。

+0

这就是我们目前正在做的事,SVN介于两者之间 - 但它是同样的问题,没有服务器,我们正在使用它基于文件。这是切换到GIT的原因之一(并且它更好地匹配我们的工作,在同一工作拷贝中在不同分支之间切换) – Alex 2009-04-15 11:25:18

5

显然使用中央混帐回购协议被支持。大多数规定的用途表示ssh或http访问,这两者都不能避免同时访问回购。即使您使用的是完全分布的使用方式,但如果有两个以上的协作者在任何地方推送相同的回购,则会出现此问题。到目前为止,没有任何回应回答这个问题。 git的设计是否允许它同时处理N个分支?