SVN+SSH模式下svnsync无密码同步失败,请求解决方案
解决svnsync无密码同步失败问题
问题分析
你遇到的"No more credentials or we tried too many times"错误,本质是svnsync在访问源SVN仓库时无法自动获取有效认证凭证——虽然你配置了SSH无密码登录,但SVN自身的凭证管理或权限配置可能存在遗漏,导致必须手动指定明文密码才能完成同步。
解决步骤
1. 确保SSH无密码登录的权限配置正确
SSH对密钥文件和目录的权限要求严格,权限不正确会直接导致无密码登录失效:
- 登录到执行svnsync命令的服务器,切换到svnsync用户:
su - svnsync - 修正
.ssh目录权限:chmod 700 ~/.ssh - 修正私钥文件(如id_rsa)权限:
chmod 600 ~/.ssh/id_rsa - 登录到目标服务器,修正svnsync用户下的
authorized_keys文件权限:chmod 600 ~/.ssh/authorized_keys
2. 配置SVN自动存储凭证
让SVN自动保存源仓库的认证信息,避免每次同步都需要手动输入密码:
- 编辑svnsync用户主目录下的
~/.subversion/servers文件,添加以下配置:[groups] svn-cluster = mastersrv.example.com, slavesrv.example.com [svn-cluster] store-plaintext-passwords = yes - 手动执行一次带
--source-password的同步命令,完成后SVN会将密码存储到~/.subversion/auth/svn.simple/目录下,后续同步即可自动读取凭证。
3. 检查源仓库的svnsync权限
svnsync需要修改源仓库的版本属性(revprop),必须确保源仓库的钩子脚本存在且可执行:
- 进入源仓库的hooks目录:
cd /path/to/source/repo/hooks - 创建
pre-revprop-change脚本:#!/bin/sh exit 0 - 给脚本添加执行权限:
chmod +x pre-revprop-change
4. 确认svnsync初始化与同步的用户一致性
- 确保初始化和同步命令都使用svnsync用户执行,避免因用户切换导致SSH密钥无法读取。
- 初始化命令示例(确保源和目标都使用svn+ssh协议及svnsync用户):
svnsync init svn+ssh://svnsync@slavesrv.example.com/repo/testrepo svn+ssh://svnsync@mastersrv.example.com/repo/testrepo --source-username=svnsync
5. 优化SSH配置(可选)
在svnsync用户的~/.ssh/config中添加服务器别名配置,简化连接并避免参数错误:
Host mastersrv HostName mastersrv.example.com User svnsync IdentityFile ~/.ssh/id_rsa Host slavesrv HostName slavesrv.example.com User svnsync IdentityFile ~/.ssh/id_rsa
之后同步命令可简化为:
svnsync synchronize svn+ssh://slavesrv/repo/testrepo --non-interactive --trust-server-cert --source-username=svnsync
内容的提问来源于stack exchange,提问作者debolar_tm
相关产品推荐
相关产品推荐

