考虑以下情况:
我有一个 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
,更新将或多或少是原子的。
我经常在生产中使用它,与在同一目录上解包相比有一些好处。
- 回滚很容易
- 您可以在不中断当前部署的情况下执行解压后程序,例如编译或安装依赖项
提示
- 每次更新,附加到一个部署日志,说明更新发生的时间,以及它们的哈希 ID 是什么。这使得回滚变得容易得多。
关于git - 如何在推送时自动 checkout ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14667128/