52

我想在(Windows)网络共享上存储一个裸 git 存储库。我使用 linux,并使用 CIFS 安装了上述网络共享。我的同事使用 windows xp,并将网络共享自动挂载(从 ActiveDirectory,不知何故)作为网络驱动器。

我想知道我是否可以使用两台计算机上的 repo,而不会出现并发问题。

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

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

那么,有没有人在网络共享上使用过 git repo,没有服务器,也没有问题?

谢谢你,
亚历克斯

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

更新:

我担心的不是网络故障的可能性。即便如此,我们将在本地拥有所需的分支,并且我们将能够编译我们的源代码。

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

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

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

更新 2:

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

4

4 回答 4

48

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

对象数据库的另一部分比较复杂——引用存储在“refs”目录下(或“packed-refs”)的文件中,并且这些文件确实会发生变化:尽管refs/*文件很小并且总是被重写而不是被编辑。在这种情况下,Git 将新 ref 写入临时“.lock”文件,然后将其重命名为目标文件。如果文件系统尊重O_EXCL语义,那是安全的。即使没有,可能发生的最坏情况也将是覆盖 ref 文件的竞赛。虽然遇到这种情况会很烦人,但它不应该导致损坏:可能只是您推送到共享存储库的情况,并且推送看起来成功了,而实际上其他人已经成功了。但这可以简单地通过拉(合并到另一个人中)来解决

总而言之,我不认为 repo 损坏是一个太大的问题 --- 确实由于锁定问题,事情可能会出错,但 Git repo 的设计会将损害降到最低。

(免责声明:理论上这一切听起来都不错,但我没有对 repo 进行任何并发锤击来测试它,并且只通过 NFS 而非 CIFS 共享它们)

于 2009-04-15T10:10:42.977 回答
8

何苦?Git 是为分布式而设计的。只需在每台机器上都有一个存储库,并使用发布和拉取机制在它们之间传播您的更改。

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

或者,在共享上分别创建一个存储库并从中完成工作,但将它们用作分布式存储库,您可以从中提取变更集。如果您使用这种方法,那么构建等的性能将会降低,因为您将不断地通过网络访问。

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

于 2009-04-15T08:25:34.447 回答
6

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

于 2009-11-10T17:20:28.053 回答
-1

听起来好像您更喜欢使用集中式版本控制系统,所以备份查询得到了满足。也许在两者之间使用 xxx2git 可以让您在本地工作。

于 2009-04-15T08:29:53.623 回答