Git仓库被清空后,如何以最小破坏性恢复并重新启用基于Git Hooks的自动部署?
恢复Git仓库并重新启用自动部署的最小破坏性方案
根据你描述的场景,客户操作导致远程Git仓库(含用于接收推送的裸仓库和工作区仓库)丢失,我们可以直接利用public目录中现存的Live站点文件来完成最小破坏性恢复,具体步骤如下:
1. 将现有public目录转为Git工作仓库
public目录里是当前Live站点的最新内容,我们直接基于它创建仓库,完全保留现有文件:
# 切换到public目录 cd /www/[sitename]_571/public # 初始化Git仓库 git init # 暂存所有现有文件 git add . # 提交初始版本,备注清楚恢复背景 git commit -m "Restore live site files after Git repo loss"
2. 重建private目录下的裸仓库(用于接收推送触发部署)
自动部署依赖这个裸仓库的post-receive钩子,我们重新创建它并关联到工作仓库:
# 切换到private目录,若目录不存在则先创建 cd /www/[sitename]_571/private mkdir -p /www/[sitename]_571/private # 创建裸仓库 git init --bare [sitename].git # 进入裸仓库的hooks目录准备配置钩子 cd [sitename].git/hooks
3. 恢复post-receive钩子脚本
重新创建原有的钩子脚本(替换[sitename]为实际站点名称),并设置执行权限:
# 创建并编辑post-receive文件 nano post-receive
粘贴以下脚本内容:
#!/bin/bash TARGET="/www/[sitename]_571/public" GIT_DIR="/www/[sitename]_571/private/[sitename].git" BRANCH="master" while read oldrev newrev ref do # only checking out the master (or whatever branch you would like to deploy) if [[ $ref = refs/heads/$BRANCH ]]; then echo "Ref $ref received. Deploying ${BRANCH} branch to production..." git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f else echo "Ref $ref received. Doing nothing: only the ${BRANCH} branch may be deployed on this server." fi done
保存退出后设置执行权限:
chmod +x post-receive
4. 同步public仓库内容到裸仓库
确保工作仓库和裸仓库内容一致,为后续推送做准备:
# 返回public目录 cd /www/[sitename]_571/public # 将裸仓库添加为远程仓库 git remote add origin /www/[sitename]_571/private/[sitename].git # 推送master分支到裸仓库 git push origin master
5. 更新本地仓库的远程地址(按需操作)
如果本地仓库原远程地址指向该裸仓库,确认地址无误即可;若有变更,执行以下命令更新:
# 在本地仓库终端执行 git remote set-url <environment> ssh://你的服务器用户名@服务器IP/www/[sitename]_571/private/[sitename].git
6. 测试自动部署流程
执行本地推送命令验证是否能正常触发部署:
git push <environment> master
查看终端输出是否出现Deploying master branch to production...提示,同时检查public目录文件是否正确更新。
关键注意点
- 整个过程未修改
public目录的现有站点文件,仅为其添加Git仓库标记,属于最小破坏性操作; - 若客户操作仅删除了裸仓库,而
public目录下的.git文件夹仍存在,可直接跳过步骤1,从步骤2开始执行; - 钩子脚本逻辑与原方案完全一致,确保自动部署流程无变化。
内容的提问来源于stack exchange,提问作者Jillian Hoenig
相关产品推荐
相关产品推荐

