在后置钩子中使用git submodule update --init命令

7

我在一个裸仓库的/hooks/post-update路径下有一个简单的钩子:

#!/bin/sh
git-update-server-info

GIT_WORK_TREE=/home/user/apps/application-site/dev git checkout -f develop
GIT_WORK_TREE=/home/user/apps/application-site/dev git submodule update --init

GIT_WORK_TREE=/home/user/apps/application-site/master git checkout -f master
GIT_WORK_TREE=/home/user/apps/application-site/master git submodule update --init

这个代码库有一些子模块,我希望将其推送到生产服务器上,并在两个目录中检出两个分支。这样我就可以得到一个 dev.myapp.com 用于开发分支和 www.myapp.com 用于主分支,同时还要更新分支上的所有子模块。

检出工作正常,但是子模块更新--init失败了,:'(

远程输出引发了这些错误。

remote: Switched to branch 'develop'
remote: You need to run this command from the toplevel of the working tree.
remote: Switched to branch 'master'
remote: You need to run this command from the toplevel of the working tree.

我不太确定该怎么做。

2个回答

8
答案就是按照git所提示的要求去做,具体来说就是:
remote: You need to run this command from the toplevel of the working tree.

那么就这样做吧。这是一个示例post-update钩子:
#!/bin/sh

export GIT_DIR=$(pwd)

cd /home/lars/projects/stackoverflow/gitstuff/worktree

git checkout -f master
git submodule init
git submodule update

这假设以下内容:
  • core.barefalse
  • receive.denyCurrentBranchignore。你需要这样设置,否则推送到一个 core.bare 设置为 false 的仓库时会出错。

...... 一些有限的测试结果表明它可以正常工作。


1
完美...只是仓库是空的。 "我在一个空仓库内的/hooks/post-update上有这个简单的hook" 我开始想,使用空仓库可能不可能。 - Mario César
但是仓库并不是空的;您正在定义一个GIT_WORK_TREE。根据定义,与工作树相关联的存储库不是裸存储库。您可以简单地克隆基本存储库,而不是设置GIT_WORK_TREE,这将在您的工作树中放置一个.git目录,但否则将是更简单的解决方案。 - larsks

2
你的第一个 GIT_WORK_TREE 变量(第4行)有问题,因为在接下来的行中,你引用了一个未在此脚本中定义的 $WORK_TREE 变量。
请注意,从git1.8.4(2013年7月)开始,您不再需要(对于git submodule命令)返回到根目录。
参见commit 091a6eb0feed820a43663ca63dc2bc0bb247bbae

子模块:删除顶级要求

使用新的rev-parse --prefix选项来处理提供给子模块命令的所有路径,放弃必须从存储库的顶层运行的要求。

由于相对子模块URL的解释取决于是否配置了“remote.origin.url”,因此在工作树的顶部以外时,请在“git submodule add”中显式阻止相对URL。

签名作者:约翰·基平(John Keeping)

根据提交 12b9d32790b40bf3ea49134095619700191abf1f的情况而定。
这使得“git rev-parse”表现得像在存储库的指定子目录中调用它一样,不同之处在于它打印的任何文件路径都以工作树顶部的完整路径为前缀。
这对于我们想要在shell脚本中cd到工作树顶部但需要处理用户在命令行上给出的相对路径的情况非常有用。

@MarioCésar,我更加困惑了。你应该定义 WORK_TREE(并在脚本中使用它)。但是如果你不停地重新定义 GIT_WORK_TREE,最终会把所有这些路径都连接在一起,这不是你想做的事情。 - VonC
非常抱歉,@VonC。这不是我使用的脚本,我没有意识到它与我的脚本不同。现在终于正确了。 - Mario César
@Mario:好的;)这是正确的,但我想它仍然会生成你提到的错误吗? - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接