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