1

我目前正在测试通过 Git 部署网站,但无法理解以下内容:

目前,我的 DEV 环境中有一个裸远程仓库,带有一个接收后挂钩,它将 GIT_WORK_TREE 设置为我的 webroot。我使用“git push DEV master”之类的语法从本地仓库推送到那里。这很好用。但是,我也有一个“开发”分支,我将其推送到 DEV(接收后挂钩设置为“git checkout -f [BRANCH_NAME]”),这也很好用。

我的问题是针对以下情况:假设我在 DEV 上发现了一个错误(从“开发”分支推送)但我没有时间修复它(也许那天有客户评论)。我希望能够做一个“git push DEV master”(master 分支对 DEV 进行了最后一次无错误推送,并且是当前 DEV 上的开发提交的祖先)并完成它。但是,当我这样做时,远程仓库告诉我“一切都是最新的!” 我认为这是有道理的,但我想做的是强制 git 从“主”分支接受推送并触发 post-receive 钩子,这对于正确部署 Web 资产是必要的。

我尝试直接进入 ssh 中的远程仓库并尝试从那里签出 master,但它告诉我我需要一个工作树来执行此操作(因为它是裸露的,我假设)。

这样做的正确方法是什么?如果可能,我想避免进行还原或变基,但也许这是唯一的方法。

4

2 回答 2

1

,但我想做的是强制 git 从“主”分支接受推送并触发 post-receive 钩子,这对于正确部署 Web 资产是必要的。

问题是您已经将更改推送到遥控器,因此没有什么可推送的。您的选择包括:

  • 强制更改您的本地分支...例如,通过更新文件中的序列号、提交和推送。
  • 只需post-receive手动在服务器上运行钩子,填写必要的环境变量。

转到远程存储库并尝试签出主分支应该可以工作,前提是您同时拥有存储库和工作树(可能通过GIT_WORK_TREE自己设置)。但是,这不会触发您的post-receive钩子,因此您需要手动处理那里的任何其他逻辑。

于 2012-08-13T20:29:47.060 回答
0

使用标签。例如,将您当前部署的版本标记为“当前”,推送此标签并让您的 post-receive-hook 作用于此标签。

#!/bin/sh
read oldrev newrev refname

$refname 现在包含 /revs/tags/current 并且 $newrev 包含标记提交的哈希。要更改为不同的修订版,请删除“当前”标签并将其设置在别处并推送标签。这样您就不需要在文件中进行虚拟更改。

于 2012-08-24T13:49:34.337 回答