我有以下设置,我正在使用子模块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初始化文件时,或者我从浏览器运行它时仍然无效。
有什么想法吗?
答案 0 :(得分:2)
即使它能够运作,你也应该知道:
如果有新的子模块,则不要初始化它们。因此,您应该使用git pull && git submodule update --init
启动脚本。
git commit -am "updating"
不会创建新的提交,因为您没有更改子模块中的任何内容。
git checkout master
仅检出分支主。这是有道理的,因为头部分离了。
注意:可能存在 master 不是您想要的分支的回购站!见下面的注释。
git pull
从远程获取并将更改合并到master中。即使这不是快进合并¹,也没有什么可以提交,因为合并提交是自动进行的。
¹因为这是您服务器上的结账,所以不需要非快进合并。否则你应该考虑合并冲突和git push
(见3.),
git submodule update --init --recursive
仅从子模块的子模块遥控器中取出并检出已经引用的提交。所以在这里没有新的东西。
如果git commit -am "updating"
实际上会创建提交,则提交将仅在签出的版本(fork)中可用,而不在引用的存储库中(请参阅中的url = …
)。 gitmodules )。因此,您在git commit -am "updating to latest version including submodules"
中提交了对其他地方不存在的子模块提交哈希的引用。
因此,在这种情况下,您需要向git push
添加git submodule foreach '…'
。另请参阅here。
正如我在对您的问题的评论中提到的,此工作流程有一个主要缺点:没有人使用子模块中的最新提交测试项目文件。这可能会破坏项目!
尝试(缩进以提高可读性):
<?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'
。