git - 如何在推送时自动 checkout ?

标签 git githooks

考虑以下情况:

我有一个 git 存储库 foo.git,其中包含一个 javascript 项目的代码。在这个存储库中有一个分支 production,它包含由从 /var/www/foo 获取代码的网络服务器提供的代码状态。此存储库是项目的主存储库。每个人都对它推 pull 。

每当有人推送到那个特定分支时,是否可以将 /var/www/foo 更新为 production 的 checkout ?您可以假设 git 守护进程(或用户 git,即所有人登录以通过 SSH 连接的用户)有权写入所述目录。

最佳答案

您必须使用 git init --bare 在服务器上创建一个裸存储库。 然后使用 post-receive Hook 来触发您的部署。 如何部署取决于您。

我的部署策略

我通常会在合乎逻辑的地方放置一个deploy 目录。 然后每次 checkout 时,我都会将最新的分支解压缩到 deploy/COMMIT_ID,其中 COMMIT_ID 是最新推送的哈希值。 checkout 完成后,您可以将符号链接(symbolic link)重新指向最新的部署目录。

我常用的目录结构:

deploy.git/
deploy/
    a7922231/
    b2f0a2af/
    latest -> b2f0a2af 

解压更新

我通常不使用 git-checkout,而是使用 git-archive 将分支解压到目录中。

# Assuming current directory is deploy.git
HEAD=`cat refs/heads/master`
mkdir -p ../deploy/${HEAD}
git archive master | tar -x -C ../deploy/${HEAD}

您的网络服务器可以指向 deploy/latest,更新将或多或少是原子的。

我经常在生产中使用它,与在同一目录上解包相比有一些好处。

  1. 回滚很容易
  2. 您可以在不中断当前部署的情况下执行解压后程序,例如编译或安装依赖项

提示

  1. 每次更新,附加到一个部署日志,说明更新发生的时间,以及它们的哈希 ID 是什么。这使得回滚变得容易得多。

关于git - 如何在推送时自动 checkout ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14667128/

相关文章:

git - 为什么重新 merge 会导致git重复 merge 冲突?

c++ - 如何将更新的 git-hash 嵌入到 Version.hpp 中?

git - Egit 钩子(Hook)不会被触发

Git-hooks 预推脚本不通过 STDIN 接收输入

git - 从父模块的 .git 将预提交 Hook 添加到子模块

python - 推送到 Git 存储库时如何设置自动部署到 AppEngine

git - 如何将文件添加到另一个分支?

git - 如何列出没有本地分支的所有远程分支?

git - 如何在没有 pull 力的情况下 push ?

Bash 确认不会等待用户输入