【问题标题】:git submodule pull and commit automatically on webservergit submodule 在网络服务器上自动拉取并提交
【发布时间】:2012-10-02 10:43:56
【问题描述】:

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

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

我现在有这个,但它没有做我想要的。我应该 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'`;

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

当 github 初始化文件,或者我从浏览器运行它时,它仍然不起作用。

有什么想法吗?

【问题讨论】:

  • 它的作用是什么?您是否尝试过切换git pull 和第一个git submodule foreach …?第二个git submodule foreach … 没有git commit
  • 我都试过了,既然从控制台运行它工作正常,它实际上应该不是脚本中的问题,对吧?它可能与权限有关吗?如果是这样,我该如何解决?
  • 你说“没有子模块(...)一切都很好”,所以我猜网络服务器具有所需的权限。脚本运行时间呢?它停在哪里?
  • 顺便说一句,你为什么要服务器更新子模块?您确定该项目适用于最新版本的子模块吗?毕竟,你只是用最后一个签出的版本来测试它。
  • 对。 git pull &amp;&amp; git submodule update --init --recursive 让服务器在主 repo 的最新提交中检查每个子模块的引用提交。

标签: git github git-submodules


【解决方案1】:

即使它会起作用,你也应该知道一些事情:

  1. 如果有新的子模块,你不要初始化它们。所以你应该用git pull &amp;&amp; git submodule update --init开始你的脚本。

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

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

      注意:可能有一些仓库 master 不是你想要的分支!请参阅下面的注释。

    • git pull 从远程获取并将更改合并到 master。即使这不是快进合并¹,也无需提交任何内容,因为合并提交是自动进行的。

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

    • git submodule update --init --recursive 仅从子模块的子模块远程获取并检查已引用的提交。所以这里也没有什么新东西可以提交。

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

    所以在这种情况下,您需要将git push 添加到您的git submodule foreach '…'。另见here

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

试试(为了更好的可读性而缩进):

<?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 = rebaseupdate = merge 添加到.gitmodules 中的每个条目。 (不再分离头!)然后运行git submodule foreach 'git checkout master'(或签出/创建任何其他跟踪分支),从现在开始您可以简单地使用git submodule foreach 'git pull'

【讨论】:

  • 完美,多亏了你的变基技巧,我才让它变得复杂,我只是使用git submodule foreach git pull 将更改包含在我的存储库中,并在服务器上运行一个简单的echo git pull &amp;&amp; git submodule update --init --recursive 2&gt;&amp;1;,一切正常.谢谢。
猜你喜欢
  • 2021-10-12
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多