Skip to content

Linux 服务器 Git 操作与故障排除手册 ​

目标: 解决服务器上 Git 拉取代码时的权限报错、反复输入密码等痛点。 场景: Ubuntu Server, Gitee 私有仓库, /srv/ 目录部署。


1. 核心问题修复 ​

1.1 "detected dubious ownership" 报错 ​

现象:

text
fatal: detected dubious ownership in repository at '/srv/core'
To add an exception for this directory, call:
    git config --global --add safe.directory /srv/core

原因: 你当前登录的用户 (如 hongjy) 不是 /srv/core 目录的所有者 (可能是 root 拥有的),Git 出于安全考虑拒绝操作。

解决方案:

  1. 添加信任白名单 (推荐):

    bash
    git config --global --add safe.directory /srv/core
    # 或者直接信任所有目录 (仅限单人使用的私有服务器)
    git config --global --add safe.directory '*'
  2. 修正目录权限 (彻底解决): 如果 /srv/core 应该归当前用户管理,直接更改所有权:

    bash
    # 将目录所有者改为当前用户 (hongjy)
    sudo chown -R $USER:$USER /srv/core

    修改后,以后在这个目录下操作 git 就不需要 sudo 了。

1.2 "Permission denied" (无法打开 .git/FETCH_HEAD) ​

现象:

text
error: cannot open .git/FETCH_HEAD: Permission denied

原因: 之前用了 sudo git pull,导致 .git 目录下的文件变成了 root 权限,现在用普通用户拉取就没权限了。

解决方案: 统一权限,建议平时操作 不要加 sudo (除非目录确实属于 root)。

bash
# 修复权限,将 .git 目录的所有权还给当前用户
sudo chown -R $USER:$USER /srv/core/.git

2. 免密拉取方案 (不再每次输密码) ​

方案 A: 凭证存储 (HTTPS 协议 - 最简单) ​

如果你是用 https://gitee.com/... 克隆的,可以使用 credential.helper 记住密码。

  1. 开启凭证存储:

    bash
    git config --global credential.helper store
  2. 执行一次操作:

    bash
    git pull
  3. 输入账号密码:

    • Username: 填写 Gitee 注册邮箱 (如 652971723@163.com)
    • Password: 填写 Gitee 密码
    • 注意: 如果开启了二次验证,密码可能需要填 Access Token (但在 Gitee 上通常直接用密码即可)。
  4. 验证: 下次再 git pull 就不需要密码了。

方案 B: SSH 密钥 (推荐 - 最安全) ​

如果你不想存明文密码,或者 HTTPS 总报错,改用 SSH 协议。

  1. 生成密钥 (在服务器上):

    bash
    ssh-keygen -t ed25519 -C "server-deploy@hongjy"
    # 一路回车,不要设密码
  2. 获取公钥:

    bash
    cat ~/.ssh/id_ed25519.pub
    # 复制输出的内容 (ssh-ed25519 AAAA...)
  3. 添加到 Gitee:

    • 登录 Gitee -> 设置 -> 安全设置 -> SSH 公钥 -> 添加公钥。
  4. 修改远程地址 (将 HTTPS 换成 SSH):

    bash
    cd /srv/core
    git remote set-url origin git@gitee.com:allenhong/core.git
  5. 验证:

    bash
    git pull
    # 第一次会提示 "Are you sure you want to continue connecting?",输入 yes

3. 常用操作速查表 ​

场景命令说明
强制覆盖本地git fetch --all && git reset --hard origin/master慎用! 放弃本地所有修改,强制与远程一致。
查看远程地址git remote -v确认是 HTTPS 还是 SSH。
查看状态git status检查是否有本地修改阻碍拉取。
放弃本地修改git checkout .还原所有被修改的文件。

4. 特殊报错:Authentication failed ​

现象:

text
remote: [session-xxx] Incorrect username or password (access token)
fatal: Authentication failed for 'https://gitee.com/...'

原因:

  1. 密码输错了。
  2. 如果是 Gitee 企业版或开启了令牌保护,必须使用 私人令牌 (Access Token) 作为密码,不能用登录密码。

解决:

  • 再次尝试 git pull,仔细输入密码。
  • 如果还是不行,去 Gitee 设置 -> 私人令牌 生成一个新的 Token,用这个 Token 当密码输入。

方舟 · Ark