Git结帐远程裸回购到旧分支

时间:2012-08-13 19:52:41

标签: git deployment web-deployment

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

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

我的问题是针对以下情况:假设我发现DEV上的错误(从'develop'分支推送)但我没有时间修复它(可能那天有客户评论)。我希望能够做一个'git push DEV master'(主分支有最后一个无错误的推送到DEV,并且是当前在DEV上的开发提交的祖先)并且完成它。但是,当我这样做时,远程回购告诉我“一切都是最新的!”我认为这是有道理的,但我想做的是强制git从'master'分支获取推送并且无论如何都要触发post-receive hook,这对于正确部署web资源是必要的。

我尝试直接转到ssh中的远程仓库,并试图从那里检查主人,但它告诉我我需要一个工作树来做这个(因为它是裸的,我假设)。

这样做的正确方法是什么?如果可能的话,我想避免做一个还原或反转,但也许这是唯一的方法。

2 个答案:

答案 0 :(得分:1)

  

,但我想做的是强制git从推动   无论如何,'主'分支并且发射后接收钩,这是   正确部署网络资产所必需的。

问题在于您已将更改推送到遥控器,因此无需推送。您的选择包括:

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

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

答案 1 :(得分:0)

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

#!/bin/sh
read oldrev newrev refname

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