如何自动提取git子模块



我被分配了一个项目,我将在那里进行后端开发,另一个人将负责前端开发。有一个要求是,前端开发人员既不能访问开发服务器,也不能访问项目代码。因此,我们决定为前端创建另一个存储库。

问题是,当有东西提交到远程回购时,我不知道如何使子模块立即从远程服务器中提取。我需要开发人员提交并立即在前端看到更改。

我一直在读关于git钩子的文章,我发现我可以使用post-receive钩子来实现这一点。然而,它似乎不起作用。以下是我所做的:

  1. 在主项目的根目录中,我找到了以下目录/.git/modules/summoduledirectory/hooks
  2. 我在允许执行权限的情况下创建了post-receive文件
  3. post-receive文件内容:

    #!/bin/sh
    git pull
    
  4. 将我的本地机器更改为子模块repo,但什么也没发生。

我做错了什么?

编辑:我将澄清关于我的问题的一些观点。

我有两个存储库:"主"存储库,它是整个项目;以及另一个存储库,它是前端的东西(视图、资产等)。让我们称之为"前端"存储库。

在我的主存储库中,我添加了前端repo作为子模块,位于/summodules/frontend内部。这样,外包的前端开发人员将无法看到任何关于实际项目的信息。他们只会看到他们在做什么。

这实际上在访问控制方面非常有效,而且我可以很容易地将前端开发的进度与项目分开监控。但有一个问题我不知道该怎么办。

我们的项目有两个独立的服务器——一个开发服务器和一个生产服务器。开发服务器需要始终位于主回购和前端回购的主分支中。这样,前端团队和后端团队都可以看到他们的更新。尽管前端团队主要使用模板,但模板可以访问存储在数据库中的数据,并使用许多集成到后端的东西(例如模型)。

为了让这个"系统"工作,每当"前端">远程回购中有新的提交时,我需要前端回购始终进行提取和合并。换句话说,如果前端团队执行git commitgit push,那么开发服务器中的"前端"回购子模块需要立即执行git pull。所以,当前端人员去测试他们的东西时,他们会立即看到最新的变化。

我读到post-receive钩子可以做到这一点,但我需要这个钩子只存在于子模块中。所以,经过一番挖掘,我发现所有的子模块钩子都存在于/.git/modules/submodules/frontend/hooks中。因此,我在该目录中创建了post-receive钩子,代码如下:

#!/bin/sh
git pull

但这并没有奏效。我的问题是如何使钩子与子模块内的post-rereceive一起工作?

我知道我所走的路线远非完美,但这是唯一对我有意义的方法,当涉及到允许开发人员只访问一个目录而不访问开发服务器时。

我希望这是有道理的。

当您git pull时,这(基本上)等同于git fetch && git merge。这不会更新子模块。

如果我理解您的需求,可以使用post-rereceive-hooks(在main.git/hooks目录中)中的命令git submodule update(或git submodule foreach 'git pull')来完成您想要的。

ADD(基于您的版本):根据我的理解,您需要在gitlab前端存储库上添加post-receive钩子,并且您的钩子必须执行命令git submodule update(或者可能是开发服务器中的git submodule foreach 'git fetch && git merge'(使用ssh命令或其他命令)。

但是,重新思考开发服务器的安装方式可能会更容易,您可以将两个repo完全分开安装(前端不是子模块),也可以将子模块/前端添加到.gitignore目录中。这并不一定意味着您必须从子模块中删除frontend,但只是不要在开发服务器中使用它。

最新更新