在这被标记为重复之前,我想澄清一下,在谷歌搜索和尝试一天之后,我仍然在我开始的地方,所以这个问题是关于如何调试为什么我没有从其他类似问题中得到预期的结果。
我的仓库有一个“开发”分支,我正在尝试设置一个登台服务器,我可以将这个分支推送到该服务器进行测试。实时服务器已经设置了一个裸 repo 和 post-receive 挂钩,以将 master 分支检出到 web 根目录。它工作得很好,所以我开始以同样的方式设置登台服务器。我的问题是登台服务器上的 Web 根始终获取主分支。
根据我所读到的内容,这是应该对我有用的解决方案:接收后是
#! /bin/sh
GIT_WORK_TREE=/path/to/web/root git checkout -f
我的本地仓库的配置有这个远程
[remote "staging"]
url = path/to.git
push = +develop:master
这个想法是,当我运行git push staging
我的本地开发分支时,我的本地开发分支被推送到远程主分支,并且该主分支被检出到 Web 根目录。
我尝试过的其他事情:
在适用的情况下,我尝试过使用和不使用前导 +s 和 -f 标志。
如果远程 repo 是问题,我删除了远程 repo 和 web root 并git init --bare
从头开始运行
在我的本地配置中没有推送行,我更改了挂钩以签出开发分支
#! /bin/sh
GIT_WORK_TREE=/path/to/web/root git checkout -f develop
以及在git push staging develop
本地运行
我通过 SSH 连接到远程并GIT_WORK_TREE=/path/to/web/root git checkout -f develop
从裸仓库运行。这导致了Switched to branch 'develop'
,但是 web 根目录中的文件仍然反映了主文件。
在这一点上,我要么错过了一些小细节,要么我快疯了。我相信很多人都有这样的工作流程设置,你能告诉我我错过了什么吗?
更新
根据@VonCs 评论,我将分支名称添加回钩子并将远程本地配置设置为push = +refs/heads/develop:refs/heads/develop
. 现在,当我推送时,我的本地开发分支将转到远程开发分支,并且在检查哈希后git log
,我知道推送正在工作。但是,如果我然后运行git status
返回是:
# On branch develop
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: a/file/I/modified/locally
所以钩子没有正确执行。如果我通过 SSH 运行 hooks/post-receive 文件的内容,它会正确检查并且我的登台站点很好。那么现在我如何确定为什么钩子不会执行以及它是否与同一个问题有关?
为了澄清,我的钩子目前看起来像:
#! /bin/sh
GIT_WORK_TREE=/path/to/web/root git checkout -f develop