我遇到了以下问题:我通过svn + ssh设置了一个公钥访问,可以找到许多教程,这些教程是通过ssh-only访问的linux机器上的subversion存储库。它似乎适用于检出,更新和提交,但如果有人试图合并或使用^运算符进行复制,它就会崩溃。
让我以示例的形式提供更多信息:svn存储库位于机器mymachine.myhost.com的文件夹/ home / bob / svn / project中,属于用户bob(又名:me)。我为alice生成了一个密钥,并将以下行添加到/home/bob/.ssh/authorized_keys中:
command="/usr/bin/svnserve -t -r /home/bob/svn/project --tunnel-user=Alice",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa <alices key> alice
Alice能够使用
结帐存储库svn co svn+ssh://bob@mymachine.myhost.com@
她可以提交更改并进行更新。但是,如果她尝试使用她的机器上的^运算符合并或执行svn cp,如下所示:
svn cp ^/trunk/ branches/alicesbranch
服务器没有反应,一段时间后她收到以下消息
svn: E210002: Unable to connect to a repository at URL 'svn+ssh://bob@mymachine.myhost.com/trunk/'
svn: E210002: To better debug SSH connection problems, remove the -q option from 'ssh' in the [tunnels] section of your Subversion configuration file.
svn: E210002: Network connection closed unexpectedly
经过一番研究后,我放弃了,因为在大多数情况下,我只会从无法访问存储库的人那里得到讨论。但是在我的情况下,我/ Alice 做可以访问,但不像某些svn操作那样通用似乎需要。
我认为我对svnserve命令和Alice用于结帐的路径的组合做错了,但我不知道是什么。
实际上,服务器是我没有root权限的机器。此外,网络似乎非常不受外部访问的限制:只允许使用ssh,但是一旦发生上述错误,I / Alice就无法在所述主机名上登录一段时间,可能是因为防火墙拒绝访问由于ssh连接失败,出于安全原因需要一段时间。这也是为什么我不能继续使用不同的svnserve命令和不同的checkout命令进行大量的试错,因为每个错误都会迫使我等到我再试一次。
这就是为什么我希望这里有人可以帮助我。我希望我提供足够的信息来解决这个问题。
诚恳, Daschm
编辑1:这是svn信息Alice会得到
Path: .
Working Copy Root Path: /home/alice/mysvnprojects/myprojectwithbob
URL: svn+ssh://bob@mymachine.myhost.com
Relative URL: ^/
Repository Root: svn+ssh://bob@mymachine.myhost.com
Repository UUID: 8f8511ce-d5fa-11e3-abfa-cd5eac3f4aa8
Revision: 121
Node Kind: directory
Schedule: normal
Last Changed Author: Alice
Last Changed Rev: 121
Last Changed Date: 2014-08-22 15:36:56 +0200 (Fri, 22 Aug 2014)
编辑2: 将svnserve命令更改为
command="/usr/bin/svnserve -t -r /home/bob/svn/ --tunnel-user=Alice"
并相应地更改co命令并不能解决问题。这是输出:
/home/alice/mysvnprojects/myprojectwithbob: svn co svn+ssh://bob@mymachine.myhost.co/project
[looong list of files]
Checked out revision 129.
/home/alice/mysvnprojects/myprojectwithbob: ls
project
/home/alice/mysvnprojects/myprojectwithbob: cd project/
/home/alice/mysvnprojects/myprojectwithbob: svn info
Path: .
Working Copy Root Path: /home/alice/mysvnprojects/myprojectwithbob
URL: svn+ssh://bob@mymachine.myhost.com/project
Relative URL: ^/
Repository Root: svn+ssh://bob@mymachine.myhost.com/project
Repository UUID: 8f8511ce-d5fa-11e3-abfa-cd5eac3f4aa8
Revision: 129
Node Kind: directory
Schedule: normal
Last Changed Author: Alice
Last Changed Rev: 129
Last Changed Date: 2014-09-02 12:33:56 +0200 (Tue, 02 Sep 2014)
/home/alice/mysvnprojects/myprojectwithbob: ls
branches trunk
/home/alice/mysvnprojects/myprojectwithbob: svn cp ^/trunk branches/mytestbranch
svn: E210002: Unable to connect to a repository at URL 'svn+ssh://bob@mymachine.myhost.com/project/trunk'
svn: E210002: To better debug SSH connection problems, remove the -q option from 'ssh' in the [tunnels] section of your Subversion configuration file.
svn: E210002: Network connection closed unexpectedly
如果我这样做
svn cp ^/trunk ^/branches/mytestbranch
相反,它似乎工作!但是,我仍然无法合并
cd trunk
svn merge ^/branches/mytestbranch .
导致已知错误。
编辑3:
似乎一切都失败了,试图访问根目录之外的任何东西。 例如:
svn co svn+ssh://bob@mymachine.myhost.com@
有效,但[假设基本设置在&#34; svnserve -r / home / bob / svn / project&#34;使用]
svn co svn+ssh://bob@mymachine.myhost.com/trunk
失败。这似乎是所有失败和工作案例的共同点。
答案 0 :(得分:0)
首先,您需要创建svn结构,方法是在项目的根目录中创建目录trunk,branches和tags并提交此更改。否则,^/trunk
和^/branches/branch
命令在服务器上显然没有中继和分支。
问题是,您正在检查整个存储库而不是主干。您应该在主干或分支上工作,并使用svn switch
在它们之间切换。要使其工作,请尝试使用以下命令检出项目:
svn co svn+ssh://bob@mymachine.myhost.co/project/trunk
如果您现在尝试合并它应该工作。问题是,您正在尝试将整个存储库与分支合并,分支实际上是该存储库的子文件夹。所以要切换到Alice分支使用:
svn switch ^/branches/mytestbranch
如果您想将其合并回主干,请先使用
切换回主干svn switch ^/trunk
然后做一个
svn merge ^/branches/mytestbranch
查看如何使用svn以及哪种工作流程是最佳实践的教程。