git submodule在webserver上自动提取和提交

时间:2012-10-02 10:43:57

标签: git github git-submodules

我有以下设置,我正在使用子模块project处理项目submodule。每当我将更改推送到github时,它都会向服务器上的update.php发送一个post请求。

这个php文件执行git命令。没有子模块,我可以做一个git pull,一切都很好,但是对于子模块,它要困难得多。

我现在有这个,但它没有做我想要的。我应该抓住repo并更新并拉出每个子模块的最新版本。

<?php echo `git submodule foreach 'git checkout master; git pull; 
git submodule update --init --recursive; git commit -m "updating"' && git pull && 
git submodule foreach 'git add -A .' 
&& git commit -m "updating to latest version including submodules" 2>&1s`;

修改// 好的,我完成了一半。

<?php echo `git submodule foreach 'git checkout master; git pull; 
git submodule update --init --recursive; git commit -am "updating"; echo "updated"' && 
git pull &&  git commit -am "updating to latest version including submodules" && 
echo 'updated'`;

echo会因为返回非零而阻止脚本停止。当我使用php update.php从控制台运行它时,它可以正常工作。

当github初始化文件时,或者我从浏览器运行它时仍然无效。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

即使它能够运作,你也应该知道:

  1. 如果有新的子模块,则不要初始化它们。因此,您应该使用git pull && git submodule update --init启动脚本。

  2. git commit -am "updating"不会创建新的提交,因为您没有更改子模块中的任何内容。

    • git checkout master仅检出分支。这是有道理的,因为头部分离了。

      注意:可能存在 master 不是您想要的分支的回购站!见下面的注释。

    • git pull从远程获取并将更改合并到master中。即使这不是快进合并¹,也没有什么可以提交,因为合并提交是自动进行的。

      ¹因为这是您服务器上的结账,所以不需要非快进合并。否则你应该考虑合并冲突和git push(见3.),

    • git submodule update --init --recursive仅从子模块的子模块遥控器中取出并检出已经引用的提交。所以在这里没有新的东西。

  3. 如果git commit -am "updating"实际上会创建提交,则提交将仅在签出的版本(fork)中可用,而不在引用的存储库中(请参阅中的url = …)。 gitmodules )。因此,您在git commit -am "updating to latest version including submodules"中提交了对其他地方不存在的子模块提交哈希的引用。

    因此,在这种情况下,您需要向git push添加git submodule foreach '…'。另请参阅here

  4. 正如我在对您的问题的评论中提到的,此工作流程有一个主要缺点:没有人使用子模块中的最新提交测试项目文件。这可能会破坏项目!

  5. 尝试(缩进以提高可读性):

    <?php echo `git pull &&
      git submodule update --init &&
      git submodule foreach 'git checkout master;
        git pull; 
        git submodule update --init --recursive;
        echo "updated"' && 
      git commit -am "updated submodules" && 
      echo 'updated'`;
    ?>
    

    关于权限的说明:

    你说它在使用php cli时有效(带子模块)。你在本地机器或服务器上试过吗?如果您在服务器上这样做了,您是否使用网络服务器的帐户进行了尝试?

    关于子模块分支的注意事项:

    使用git checkout master(参见2.1),您只能使用子模块的主分支。要更改此设置,请为update = rebase中的每个条目添加update = merge.gitmodules。 (不再分离头了!)然后运行git submodule foreach 'git checkout master'(或检查/创建任何其他跟踪分支),从现在开始您只需使用git submodule foreach 'git pull'