如何让git push仅更新已提交内容,避免覆盖服务器本地修改文件?
问题解决方案
核心原因
你当前DreamHost服务器的钩子脚本用了git checkout -f main,其中-f(强制)参数会直接覆盖工作区所有未提交的本地修改,包括你改的db/config.php。而cPanel的「从远程更新」工具默认用了更安全的同步逻辑,不会强制覆盖未提交的本地变更,所以没出现这个问题。
推荐解决方案(彻底解决)
把环境专属的配置文件从Git追踪里移除,这是行业通用的最佳实践:
本地仓库配置
- 在本地项目根目录,把
db/config.php加入.gitignore,让Git不再追踪该文件:echo "db/config.php" >> .gitignore - 从Git索引中移除该文件(保留本地文件不删除):
git rm --cached db/config.php - 提交并推送这个变更到远程仓库:
git add .gitignore git commit -m "停止追踪db/config.php配置文件" git push origin main
- 在本地项目根目录,把
服务器端操作
- 先备份服务器上当前的
db/config.php文件:cp /home/username/example.com/db/config.php /home/username/config_backup.php - 执行一次钩子更新(或手动拉取远程变更),此时服务器上的
db/config.php会被删除(因为Git不再追踪),再把备份的配置文件放回原位置:cp /home/username/config_backup.php /home/username/example.com/db/config.php
之后再推送变更到DreamHost,就不会覆盖该配置文件了。
- 先备份服务器上当前的
临时解决方案(适合不想移除追踪的场景)
方案1:修改钩子脚本为git pull
替换原钩子脚本内容:
#!/bin/sh cd /home/username/example.com git pull dreamhost main
注意:如果服务器上的db/config.php有未提交修改,git pull会触发冲突,需要先手动处理:
cd /home/username/example.com # 暂存本地配置修改 git stash push -m "临时保存配置变更" db/config.php # 拉取远程变更 git pull dreamhost main # 恢复本地配置 git stash pop
方案2:给文件设置skip-worktree标记
在服务器上执行以下命令,让Git忽略该文件的本地修改:
cd /home/username/example.com git update-index --skip-worktree db/config.php
如果之后需要取消该标记,执行:
git update-index --no-skip-worktree db/config.php
此方法仅在当前服务器仓库生效,重新克隆仓库后需要重新设置。
内容的提问来源于stack exchange,提问作者M T
相关产品推荐
相关产品推荐

