Gas*_*sim 5 git git-submodules
我被分配了一个项目,我将在其中进行后端开发,另一个人将负责前端开发。要求前端开发人员无法访问开发服务器,也无法访问项目代码。因此,我们决定为前端创建另一个存储库。
问题是我不知道如何使子模块在将某些内容提交到远程存储库时立即从远程服务器中提取。我需要开发人员提交并立即在前端看到更改。
我一直在阅读有关 git hooks 的内容,我发现我可以使用post-receivehook 来做到这一点。然而,它似乎不起作用。这是我所做的:
post-receive允许可执行权限的文件。文件内容post-receive:
#!/bin/sh
git pull
Run Code Online (Sandbox Code Playgroud)将更改从我的本地计算机推送到子模块存储库,但什么也没发生。
我究竟做错了什么?
编辑:我将澄清有关我的问题的一些观点。
我有两个存储库:“主”存储库,这是整个项目;另一个存储库,它是前端的东西(视图、资产等)。我们称之为“前端”存储库。
在我的主存储库中,我将前端存储库添加为子模块,位于 /submodules/frontend 内。这样,外包的前端开发人员将无法看到有关实际项目的任何信息。他们只会看到他们正在做的事情。
这实际上在访问控制方面非常有效,我可以轻松地与项目分开监控前端开发的进度。但有一个问题我不知道该怎么办。
我们的项目有两个独立的服务器 - 一个开发服务器和一个生产服务器。对于主存储库和前端存储库,开发服务器都需要始终位于主分支中。这样,前端团队和后端团队都可以看到他们的更新。尽管前端团队主要使用模板,但模板可以访问存储在数据库中的数据,并使用许多集成到后端的东西(例如模型)。
为了使这个“系统”正常工作,我需要前端存储库在“前端”远程存储库中有新提交时始终获取和合并。换句话说,如果前端团队git commit这样做git push,则开发服务器中的“前端”存储库子模块需要立即git pull。因此,当前端人员去测试他们的东西时,他们会立即看到最新的变化。
我读到该post-receive钩子可以做到这一点,但我需要这个钩子仅存在于子模块中。因此,经过一番挖掘,我发现所有子模块挂钩都存在于/.git/modules/submodules/frontend/hooks. 因此,我post-receive使用以下代码在该目录中创建了钩子:
#!/bin/sh
git pull
Run Code Online (Sandbox Code Playgroud)
但这没有用。我的问题是如何使钩子与子模块内的 post-receive 一起工作?
我知道我所采取的路线远非完美,但当涉及到允许开发人员仅访问一个目录而无需访问开发服务器时,这是对我来说唯一有意义的方法。
我希望这是有道理的。
当您 时git pull,这(基本上)相当于git fetch && git merge。这不会更新子模块。
如果我了解您的需求,您可以使用接收后挂钩(在主 .git/hooks 目录中)中的命令git submodule update(或 )来完成您想要的操作。git submodule foreach 'git pull'
ADD(基于您的版本):根据我的理解,您需要post-receive在 gitlab 前端存储库上添加钩子,并且您的钩子必须执行该命令git submodule update(或者可能git submodule foreach 'git fetch && git merge' 在开发服务器中(使用 ssh 命令或其他命令)。
但重新考虑如何安装开发服务器可能会更容易,您可以将 2 个存储库安装为完全独立的(不是前端是子模块),并且可能将子模块/前端添加到您的 .gitignore 目录中。这并不一定意味着您必须frontend从子模块中删除,而只是不在您的开发服务器中使用它。