我的 svn 设置已经运行多年了,现在突然就不行了。我正在使用 svn+ssh。我可以直接通过 ssh 进入服务器,然后就可以运行,type svnserve
这样就可以了svnserve is /usr/local/bin/svnserve
,我也可以从客户端执行以下操作:
ssh -p 1234 user@myserver "sh -l -c 'type svnserve'"
并得到与上面相同的响应。但是当我运行
svn list -v svn+ssh://user@myserver/my_repo
SSH 身份验证成功后,它会给我sh: svnserve: command not found
。如果我直接在服务器上执行此操作而不使用 ssh,我可以正常列出 repo。有人可以帮忙吗?谢谢
ps 我是唯一使用这个 svn 服务器的用户。
答案1
我想到了
创建 svnwrapper.sh(
vi svnwrapper.sh
)/bin/sh #!/bin/sh 复制代码
#设置 umask,使文件为组可写 umask 002
#调用‘真正的’ svnserve,同时传递默认的 repo 位置 exec /usr/local/bin/svnserve "$@" -r /
将其保存在用户目录中,例如
/var/services/homes/my_user
- 这是在 synolgy NAS 上chmod 755 svnwrapper.sh
cd /usr/bin
ln -s /var/services/homes/my_user/svnwrapper.sh svnserve
vi .bashrc
在 /var/services/homes/my_user 中创建 .bashrc( )chmod 755 .bashrc
,.bashrc 的内容为/bin/sh #!/bin/sh 复制代码
导出 PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin:$PATH"
请注意exec /usr/local/bin/svnserve "$@" -r /
,在 svnwrapper 中,这将允许您在客户端的 repo 中使用完整路径,将最后一个/
路径替换为您想要启动 repos 的路径。
答案2
在我们的例子中,运行
ln -s /var/packages/SVN/target/bin/svnserve /usr/bin/svnserve
在 Synology 上。
答案3
非常感谢!<3这拯救了我们公司的 SVN!:)
看起来最近的 DSM 和 SVN 更新组合一定在深层次上造成了一些问题。通过终端跟踪 SSH 和 SVN 错误消息,似乎罪魁祸首是启动 SH 进程并尝试运行 svnserve 的计算机用户找不到的 svnserve 二进制文件。
但是,对于该问题还有一个更简单(并且理所当然的,粗暴)的解决方案,不需要任何包装器或脚本或 BASH 配置文件:只需在其 Synology 包路径中创建一个全局可用的 SymLink 到 svnserve 二进制文件的实际位置。
Synology SVN 包中的 svnserve 位于此处:/var/packages/SVN/target/bin/svnserve
我最终要做的就是在 /usr/bin/ 文件夹中创建指向该文件的 SymLink,现在一切都可以按预期工作了。
然后通过 SSH 登录
cd /usr/bin
ln -s /var/packages/SVN/target/bin/svnserve svnserve
这应该可以解决问题。“在这里有效。” :)
如果没有您的指导,我们可能仍然会惊慌失措并寻找解决方案,所以再次感谢您解决这个问题!