【问题标题】:Git checkout remote bare repo to an older branchGit 签出远程裸仓库到旧分支
【发布时间】:2012-08-13 19:52:40
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: git deployment web-deployment


    【解决方案1】:

    ,但我想做的是强制 git 从 'master' 分支并触发 post-receive 钩子,这是 正确部署网络资产所必需的。

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

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

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

    【讨论】:

    • 很好的答案,谢谢。我会稍等一下,看看是否还有其他建议,但我今晚一定会尝试这些。
    • 顺便说一句,您对 GIT_WORK_TREE 的看法是完全正确的;对于其他可能想要在工作树与 repo 本身分开的远程 repo 中执行相同操作的其他人,请使用 .git 目录中的以下语法:GIT_WORK_TREE=/path/to/work/tree git checkout [branch_name]
    【解决方案2】:

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

    #!/bin/sh
    read oldrev newrev refname
    

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

    【讨论】:

    • cool,谢谢,下次遇到这种情况我会试试这个方法
    猜你喜欢
    • 2011-11-26
    • 2021-05-27
    • 1970-01-01
    • 2017-03-08
    • 2012-01-05
    • 2019-06-29
    • 2013-02-15
    • 2011-05-26
    • 2019-06-19
    相关资源
    最近更新 更多