在post hook上使用git子模块更新--init

时间:2011-09-29 06:46:35

标签: git

我在裸存储库中的/ 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 master分支,所有这些也更新了分支上的子模块。

Checkout正在按预期工作,但不是子模块更新--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 个答案:

答案 0 :(得分: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 :(得分: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。 / p>      

签名:John Keeping

取决于commit 12b9d32790b40bf3ea49134095619700191abf1f

  

这使得“git rev-parse”的行为就像从存储库的指定子目录中调用一样,区别在于它打印的任何文件路径都以前面的完整路径为前缀。工作树

     

这对于shell脚本很有用,我们可能希望cd到工作树的顶部,但需要处理用户在命令行上给出的相对路径。