You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让git push仅更新已提交内容,避免覆盖服务器本地修改文件?

问题解决方案

核心原因

你当前DreamHost服务器的钩子脚本用了git checkout -f main,其中-f(强制)参数会直接覆盖工作区所有未提交的本地修改,包括你改的db/config.php。而cPanel的「从远程更新」工具默认用了更安全的同步逻辑,不会强制覆盖未提交的本地变更,所以没出现这个问题。

推荐解决方案(彻底解决)

把环境专属的配置文件从Git追踪里移除,这是行业通用的最佳实践:

  1. 本地仓库配置

    • 在本地项目根目录,把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
      
  2. 服务器端操作

    • 先备份服务器上当前的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:35:18