【问题标题】:git post-receive hook to update multiple serversgit post-receive hook 更新多个服务器
【发布时间】:2025-12-06 22:10:01
【问题描述】:

我正在使用git post-receive hook 在三台服务器(开发、测试和生产)上部署来自三个分支(主、暂存和稳定)的 Web 应用程序版本。分支和服务器之间的配对目前在脚本中是硬编码的。但是我想删除这个限制,让这个钩子可以管理无限数量的分支。可以通过以下方式完成:

  • 将所有每个分支的配置选项移动到一些单独的文件中,例如.git/???/<branch_name>
  • 主脚本将检查此类文件是否可用于每个分支,获取它,然后使用该文件中的配置参数部署到远程服务器上。

但是我不知道在.git 目录中我可以放置这些文件的确切位置。或者也许有更好的解决方案?

【问题讨论】:

    标签: git deployment githooks


    【解决方案1】:

    据我所知,您的选择:

    • 对服务器命名使用更严格的约定,这样除了基本域名之外就不需要配置。将其留在脚本中。 (即 branchX -> branchX-deploy.example.com。)

    • 按照您的建议,在 .git 目录中的任何位置放置一个配置文件。如果它不是 git 关心的文件名,它永远不会注意到它。不过,我不确定为什么你会想要这样做。

    • 把它放在 .git/config 中。 Git 允许您定义branch.<name>.foo 形式的任意配置参数。 (我不知道这是功能还是疏忽。据我所知,它没有记录。)在您的情况下,branch.master.deploy_server 之类的设置为development.example.com。然后,您的脚本可以通过 all 分支,并检查该配置选项是否已设置。 (使用git config --get。)

    • 在您的存储库中放置一个配置文件。这似乎比把它藏起来要好得多。您不妨跟踪设置。如有必要,提供一种覆盖它们的方法 - 提供不同的配置文件作为参数,提供单独的分支/服务器作为选项,交互式提示,任何适合你的东西。

    就个人而言,我可能会做最后一个。跟踪设置,即使它们只是默认设置,也不会伤害您。

    【讨论】:

    • 我希望至少有用户名、主机名和目标目录,这样只有命名分支是行不通的。我也不想将这样的配置放在源代码树中,因为它与源无关,我不想用不必要的知识打扰开发人员。看来我会使用.git/config,因为它是目前最干净的解决方案。
    • 郑重声明,我完全不同意 .git/config 是最干净的。它没有被追踪。
    • 但这确实是我想要的。由于部署不是开发人员(作为角色)的任务,因此不应跟踪此文件并且无论如何都不应供开发人员使用。跟踪文件的责任仅在于管理员及其工具。我有implemented这个解决方案,也许它对我以外的人有用。