解决复制测试站点与原生产站点的Git Detached Head问题
Drupal 9.4 站点远程 Git 仓库 detached HEAD 问题排查与解决方案建议
问题背景
作为 Git 和 Composer 新手,我维护着一个 Drupal 9.4 站点,通过这两个工具搭建并仅保留必要插件。域名迁移后,请求主机复制站点创建测试站,尝试用 Composer 添加 Google Analytics 模块并 push 到远程仓库时,遇到远程服务器 detached HEAD问题,无法推送,且测试站和生产站均存在该问题。
已尝试操作
- 使用 Git 版本 >2.3,执行
git config receive.denyCurrentBranch updateInstead,仍无法推送到非 bare 仓库; - 创建临时分支捕获 HEAD,切换回 master 后仍处于 detached HEAD 状态;
- 执行
git revert HEAD~1回滚提交,未解决问题。
当前状态检查
- 测试站:Git 状态显示在 master 分支且与 origin/master 同步,但切换到 origin/master 时显现 detached HEAD;
- 生产站:处于
detached at origin/master状态,存在未提交的.DS_Store文件。
技术疑问
- 主机复制/克隆站点的过程中,是否可能自动添加了标签、引用或分支?
- 所有分支和 HEAD 都指向最后一次提交,为何仍出现 detached HEAD 问题?
解决方案建议
一、修复 detached HEAD 问题的具体步骤
1. 清理生产站未提交文件
先处理生产站的 .DS_Store 无关文件,避免干扰仓库状态:
git rm --cached .DS_Store echo ".DS_Store" >> .gitignore git add .gitignore git commit -m "Add .DS_Store to gitignore"
2. 修正远程仓库的分支状态
分别登录测试站和生产站的服务器,进入站点目录执行:
# 切换到主分支(若你的主分支是 main 则替换为 main) git checkout master # 绑定本地分支与远程分支的跟踪关系 git branch --set-upstream-to=origin/master master
执行后用 git status 确认,确保处于 master 分支而非 detached 状态。
3. 重新配置非 bare 仓库的推送权限
确认 receive.denyCurrentBranch updateInstead 配置是在远程仓库中设置的(而非本地):
登录远程服务器,进入站点的 .git 目录执行:
git config receive.denyCurrentBranch updateInstead
同时确保远程工作目录没有未提交的修改,否则推送会失败。
二、长期维护方案选择
不建议转回 SFTP
SFTP 无法跟踪版本变更,对于依赖 Composer 的 Drupal 站点来说,Git+Composer 的组合能更好地维护核心、模块的版本一致性,避免手动更新带来的冲突和安全风险,更适合长期维护。
重新初始化 Git 仓库(备选方案)
若上述步骤无法解决问题,可尝试彻底重置仓库:
- 本地备份
.gitignore、composer.json、composer.lock这三个关键文件; - 删除本地和远程服务器上的
.git文件夹; - 本地重新初始化仓库:
git init git add . git commit -m "Initial commit for Drupal 9.4 site" git remote add origin <远程仓库地址> - 远程服务器创建 bare 仓库(推荐用 bare 仓库接收推送,避免 detached HEAD 问题):
mkdir site-repo.git cd site-repo.git git init --bare - 本地推送到 bare 仓库,再在远程站点目录拉取代码:
cd /path/to/site git clone /path/to/site-repo.git .
三、保障 Composer 维护核心需求
无论采用哪种方案,务必保留 composer.json 和 composer.lock,后续通过以下命令维护 Drupal 核心与模块:
# 更新 Drupal 核心 composer update drupal/core-recommended --with-all-dependencies # 添加 Google Analytics 模块 composer require drupal/google_analytics # 提交 Composer 变更到 Git git add composer.json composer.lock git commit -m "Add Google Analytics module" git push origin master
内容的提问来源于stack exchange,提问作者duncanf
相关产品推荐
相关产品推荐

