fix: run skill git sync as repo owner

This commit is contained in:
wuyang6
2026-05-25 21:24:58 +08:00
parent 970d62b539
commit 902c9c86c2
+19 -2
View File
@@ -787,14 +787,30 @@ class AgentState:
repo = config.cwd
if not (repo / '.git').exists():
raise ValueError(f'当前工作目录不是 git 仓库:{repo}')
git_prefix: list[str] = []
if os.name == 'posix' and hasattr(os, 'geteuid') and os.geteuid() == 0:
try:
repo_owner = pwd.getpwuid(repo.stat().st_uid).pw_name
except (KeyError, OSError):
repo_owner = ''
if repo_owner and repo_owner != 'root':
git_prefix = [
'sudo',
'-H',
'-u',
repo_owner,
'env',
'GIT_TERMINAL_PROMPT=0',
]
def run_git(args: list[str], *, timeout: int = 60) -> subprocess.CompletedProcess[str]:
env = {
**os.environ,
'GIT_TERMINAL_PROMPT': '0',
}
command = [*git_prefix, 'git', *args] if git_prefix else ['git', *args]
proc = subprocess.run(
['git', *args],
command,
cwd=repo,
capture_output=True,
text=True,
@@ -803,7 +819,8 @@ class AgentState:
)
if proc.returncode != 0:
detail = (proc.stderr or proc.stdout or '').strip()
raise ValueError(f'git {" ".join(args)} 失败:{detail}')
run_as = f'(以 {git_prefix[3]} 用户执行)' if git_prefix else ''
raise ValueError(f'git {" ".join(args)}{run_as} 失败:{detail}')
return proc
dirty = run_git(['status', '--porcelain', '--untracked-files=no']).stdout.strip()