- 主题:把 git 布署到一个共享的 nfs 目录里面会怎么样?
假设有两台电脑挂载了同一个服务器 nfs 目录到 ~/gitrepo/
我在里面 git init 了一个 demo 仓库。
那么两个人就这样子直接使用这个 demo 仓库,直接在里面 git commit 会有什么问题吗?
这样子两个人共用工作区,当然不太好了。换一种做法:
cd ~
git clone /mnt/gitrepo/demo.git
这样子我在 demo 工程里面操作完,两个人同时执行 git push 会出什么问题吗?仓库在 git push 的时候会加锁吗?
--
FROM 183.253.147.*
第二种只要 nfs 支持文件锁就没啥问题对吧?
git push 会不会在仓库里面先创建一个锁文件,如果有另外一个 git push 检测到这个锁文件就禁止另外一个 push? 需要文件系统支持 flock?
我知道有很多 git 服务器。只是想实验一种新的方法。
【 在 VincentGe 的大作中提到: 】
: 第一种不行,第二种问题不大,但是不建议。
: 推荐你在服务器部署一个gitea。
: 这是常见的工作流。
: ...................
--
FROM 120.41.147.*
async 的 nfs,打开文件时也得去服务器处理。
我之前看的资料说 sync/async 只影响文件打开之后的读写。
【 在 StephenLee 的大作中提到: 】
: 可能跟 nfs的挂载参数有关系,要nfs4才完整支持文件锁,local file lock选项不能开,sync / async 不确定有没有影响
--
FROM 120.41.147.*
你这样说我就放心了。
看源代码要花费比较多的时间。所以我就直接在论坛这边问一下了。看看大家有没有相关的经验。
【 在 VincentGe 的大作中提到: 】
: git不依赖文件系统的锁
: git的push是原子性的
: 具体你实验或看git源码
: ...................
--
FROM 120.41.147.*
我测试了一下,git 仓库位于本地 fs 的和远程文件系统的情况。
首先从 orgin git clone 两个仓库,然后分别往里面复制 linux 内核源代码这样的大型项目后都 commit.
此时,拉出两个命令行,同时执行 git push.
测试发现最终总有一个 git push 不成功。原因是加不上锁。
按说通过 ssh 使用的 git 与 nfs/localfs 没太大差别。所以我估计 git push 到 nfs 目录应该也是没问题的。
【 在 VincentGe 的大作中提到: 】
: 你别放心,你放心我就担心了,数据无价,不要乱来。
: 我建议你按照常见的开发模式来。
: git push是通过引用实现的,它会在远程仓库创建一个引用,然后进行检查,然后进行移动引用。
: ...................
--
FROM 120.36.238.*
如果 git 没有冲突机制,允许两个 git 进程往同一个仓库里面复制文件和修改文件,那就会成功啊。但是此时数据结构已经被破坏了。
我的测试结果是 git 会检测到冲击。说明 git 有考虑到这种情况并且做了处理。数据结构不会被破坏。这是正确的实现。
但我仍然不能从原理上面确定这件事是不可行的。只是直觉认为布署在 nfs 里面的 git 仓库和布署在 ssh 里面的仓库不应该有差别。
【 在 VincentGe 的大作中提到: 】
: 到现在我有些不太理解了
: 你在同一个仓库两次git push,那必然有一个是不成功。
: 一个提交之后,另一个提交就会产生冲突。
: ...................
--
FROM 120.36.238.*
是的是的。。
我刚开始是两个人同时在一个工作区里面提交。后来想想这样子好像不太对。
所以后面换成了在挂载的远程目录里面放个 git-demo.git 这个 bare 仓库。
我感觉我这个思路是可行的。因为推送到 ssh://remote/demo.git 和到 nfs://remote/demo.git 应该没有区别才对。我看 ssh 的原理是在远程运行起一个 git 进程,往服务器目录里面写文件。多个人推送,ssh 就会启动多个 git 进程。和我的场景一样。
【 在 VincentGe 的大作中提到: 】
: 我理解你的想法了,对于git来说,他工作在文件系统之上并且不依赖文件锁,因此你无需考虑两者之间的差别。
: 你的这个方案我我后来想想你在担忧这个问题。
: 原本你希望两个用户在一个工作区工作,同时提交,但这会引发混乱,于是你又想了一个办法,两个人克隆一个中心仓库,这时,一共有三个仓库。
: ...................
--
FROM 120.41.147.*