如何自动拉取git子模块?

时间:2016-05-30 12:01:48

标签: git git-submodules

我被分配了一个项目,我将在那里进行后端开发,另一个人将处理前端开发。要求前端开发人员无权访问开发服务器,也无法访问项目代码。因此,我们决定为前端创建另一个存储库。

问题是我不知道如何在将某些东西提交到远程仓库时立即从远程服务器上拔出子模块。我需要开发人员提交并立即看到前端的更改。

我一直在阅读git hooks,我发现我可以使用post-receive钩子来做到这一点。但是,它似乎不起作用。这是我做的:

  1. 从主项目的根目录,我找到了以下目录/.git/modules/submodule-directory/hooks
  2. 我创建了post-receive文件,允许执行权限。
  3. post-receive档案的内容:

    #!/bin/sh
    git pull
    
  4. 从本地计算机推送到子模块仓库,但没有任何反应。

  5. 我做错了什么?

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

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

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

    这实际上在访问控制方面非常有效,我可以轻松地与项目分开监控前端开发的进度。但是有一个问题我不知道该怎么做。

    我们的项目有两个独立的服务器 - 开发服务器和生产服务器。开发服务器需要始终位于主分支和前端仓库的主分支中。这样,前端团队和后端团队都能够看到他们的更新。即使前端团队主要使用模板,模板也可以访问存储在数据库中的数据,并使用大量集成到后端的东西(例如模型)。

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

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

    #!/bin/sh
    git pull
    

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

    我知道我所采取的路线远非完美,但这是允许开发人员只访问一个目录而无需访问开发服务器的唯一方法。

    我希望这是有道理的。

1 个答案:

答案 0 :(得分:2)

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

如果我了解您的需求,您可以使用命令git submodule update(或git submodule foreach 'git pull')在后接收挂钩(主.git / hooks目录中)中完成所需。

ADD(基于您的版本):根据我的理解,您需要在gitlab前端存储库中添加post-receive挂钩,并且您的挂钩必须执行命令git submodule update(或者{ {1}}在开发服务器中(使用ssh命令或其他东西)。

但是重新考虑开发服务器的安装方式可能更容易,您可以将2个repos安装为完全分离(不是前端是子模块),也可以将子模块/前端添加到.gitignore目录中。这不一定意味着您必须从子模块中删除git submodule foreach 'git fetch && git merge',但不要在开发服务器中使用它。