在Linux上使用公钥的svn + ssh:merge失败但是co,up,commit工作

时间:2014-09-02 09:07:03

标签: linux svn ssh public-key svnserve

我遇到了以下问题:我通过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

失败。这似乎是所有失败和工作案例的共同点。

1 个答案:

答案 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以及哪种工作流程是最佳实践的教程。