ci(部署): rsync 加 --no-owner --no-group,别把 runner 的 uid 搬到服务器
Some checks failed
Deploy / deploy (push) Has been cancelled

服务器上 `git pull` 报「检测到可疑的仓库所有权」:

    drwxr-xr-x 9 1001 1001  /root/OJDeploy/OJ2
    drwxr-xr-x 8    0    0  /root/OJDeploy/OJ2/.git

原因是 `rsync -a` 展开含 `-o -g`(保留属主/属组),接收端又是 root,
所以源端的 uid 会被真写上去 —— GitHub 托管 runner 的 runner 用户是 uid 1001。
而 `.git` 在 --exclude 里,一直是当初手动 clone 时的 root。两者对不上,
git 2.35.2 起的 safe.directory 检查就把服务器上所有 git 操作挡下了。

加 --no-owner --no-group 之后文件落地归 ssh 登录用户(root)所有,不再错位。

注意这只防复发,**不修复已经错位的目录**:rsync 不带 -o/-g 时不会去改已存在
文件的属主。服务器上还要手动跑一次

    chown root:root /root/OJDeploy/OJ2

只改这一个目录,**不要 -R** —— git 的属主检查不递归,而 OJ2/data 下可能是
「自带数据」形态的整个 postgres 数据目录和判题沙箱以别的 uid 建的运行目录,
递归 chown 会让它们起不来。

这个问题一直都在,只是以前没在服务器上跑过 git 命令所以没撞上。

验证:只做了 YAML 语法校验 —— 这条工作流要真的 push 到 github 才跑得起来,
本机验不了。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-26 08:08:06 -06:00
parent 586c88f629
commit 66d325d460

View File

@@ -84,9 +84,15 @@ jobs:
# 整个 postgres 数据目录。删了就是删库。
# node_modules 服务器上根本不需要prebuilt 形态下连编都不编),传过去纯浪费。
# .git checkout 出来的 .git 没有任何用处。
#
# --no-owner --no-group 别删:`-a` 展开含 `-o -g`(保留属主/属组),而接收端是
# rootrsync 会把**源端的 uid 真写上去**——GitHub 托管 runner 的 runner 用户是
# uid 1001于是服务器上的工作区目录变成 1001 所有。而 `.git` 被 --exclude 掉,
# 还是当初手动 clone 时的 root。两者对不上之后在服务器上跑任何 git 命令都会被
# 「检测到可疑的仓库所有权」挡下git 2.35.2 起的 safe.directory 检查)。
- name: 同步到服务器
run: |
rsync -az --delete \
rsync -az --no-owner --no-group --delete \
-e "ssh -i ~/.ssh/id_deploy -p $REMOTE_PORT" \
--exclude node_modules \
--exclude .git \