你如何修复SVN 409冲突错误

时间:2010-03-30 17:54:52

标签: svn apache macos subversive osx-snow-leopard

我曾经在OS X Leopard上使用SVN 1.4,一切都很好。几周前,我安装了OS X 10.6的新副本。 Snow Leopard附带的SVN版本是1.6.5。我继续用1.6.6构建我自己的副本。我正在使用内置的apache服务器,只在本地托管存储库。

在我真正尝试提交某些内容之前,所有内容似乎都运行良好。每次我尝试提交更改时,都会收到以下消息:

Transmitting file data .svn: Commit failed (details follow):
svn: MERGE of '/svn/svn2': 409 Conflict (http://localhost)

这发生在我的旧存储库中,因此我创建了几个新的存储库。同样的交易。我也尝试使用系统附带的1.6.5版本......相同。最后,我尝试升级到最新的稳定SVN(1.6.9)并仍然遇到同样的问题。

Apache错误会针对每个失败的提交记录以下内容:

[Mon Mar 29 19:53:10 2010] [error] [client ::1] Could not MERGE resource "/svn/svn2/!svn/act/d399326f-c20f-424f-bb68-3bb40503b5b1" into "/svn/svn2".  [409, #0]
[Mon Mar 29 19:53:10 2010] [error] [client ::1] An error occurred while committing the transaction.  [409, #2]
[Mon Mar 29 19:53:10 2010] [error] [client ::1] Can't open directory '/usr/local/svn/svn2/db/transactions/5-6.txn/\xeb\xa9\x0f\x1f': No such file or directory  [409, #2]
[Mon Mar 29 19:53:11 2010] [error] [client ::1] Could not DELETE /svn/svn2/!svn/act/d399326f-c20f-424f-bb68-3bb40503b5b1.  [500, #0]
[Mon Mar 29 19:53:11 2010] [error] [client ::1] could not open transaction.  [500, #2]
[Mon Mar 29 19:53:11 2010] [error] [client ::1] Can't open file '/usr/local/svn/svn2/db/transactions/5-6.txn/props': No such file or directory  [500, #2]

来自访问日志:

::1 - - [30/Mar/2010:13:02:20 -0400] "OPTIONS /svn/svn2 HTTP/1.1" 401 401
::1 - user [30/Mar/2010:13:02:20 -0400] "OPTIONS /svn/svn2 HTTP/1.1" 200 188
::1 - user [30/Mar/2010:13:02:20 -0400] "PROPFIND /svn/svn2 HTTP/1.1" 207 647
::1 - user [30/Mar/2010:13:02:20 -0400] "PROPFIND /svn/svn2 HTTP/1.1" 207 647
::1 - user [30/Mar/2010:13:02:20 -0400] "PROPFIND /svn/svn2/!svn/vcc/default HTTP/1.1" 207 398
::1 - user [30/Mar/2010:13:02:20 -0400] "PROPFIND /svn/svn2/!svn/bln/6 HTTP/1.1" 207 449
::1 - user [30/Mar/2010:13:02:20 -0400] "REPORT /svn/svn2/!svn/vcc/default HTTP/1.1" 200 1172

奇怪的是,提交确实提交了更改,但是工作副本没有看到,并且一切都变得棘手。

我已经尝试了Google可以解决这个问题的所有变体,但搜索结果几乎没用。我没有使用TortoiseSVN或任何特殊的东西,并且在新的存储库上提交失败,所以我知道这对我的旧存储库来说不是问题。

非常感谢任何帮助。

更新
我试过在我的svn.conf文件中添加autoversioning。这是我的文件所说的内容:

LoadModule dav_svn_module /usr/libexec/apache2/mod_dav_svn.so
<Location /svn>
  DAV svn
  SVNParentPath /usr/local/svn
  SVNAutoversioning on

  # how to authenticate a user
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /usr/local/etc/svn-auth-file

  # only authenticated users may access the repository
  Require valid-user
</Location>    

更新(解决方案)

我只是想用实际的解决方案来更新它,以防其他人在完全无用的错误消息中遇到同样的问题。问题在于apr和apr-util部分(如方案所示)。我正在使用subversion依赖项包构建两者的副本。 OS X 10.6也有它自己的版本。两个版本都是1.3.8。显然,我需要使用默认的apache安装使用的版本。

所以,我从我的subversion版本中删除了apr和apr-util文件夹,以确保我没有再次构建我自己的副本。我再次从源代码构建了svn,这次使用以下配置:

./configure --with-apr=/usr/bin/ --with-apr-util=/usr/bin/ --with-ssl

再次构建之后,我重新启动了apache,并创建了一个新的svn repo。我能够检查出来,进行更改,并且没有任何问题地提交。然后我尝试了旧的回购,那些也很好用。

感谢大家的帮助!

6 个答案:

答案 0 :(得分:3)

我这里的冰很薄(409不是很具体),但我能够提出两个问题:

  1. 是否有任何预提交或提交后挂钩?
  2. Autoversioning”已启用吗?
  3. 如果有任何钩子,你确定它们没有任何错误吗?你可以禁用它们进行测试吗?如果未启用自动转换,您是否可以尝试启用它以进行测试?这应该按照

    的方式工作
    <Location /repos>
      DAV svn
      SVNPath /var/svn/repository
      SVNAutoversioning on
    </Location>
    

    使用mod_dav_svn时(请参阅上面的自动转换链接)。

    也许这有助于揭示您的问题,我们(和/或Google :))可以从那里接受它。

    顺便说一下:你发布的日志不是来自同一个提交,对吧?时差会很大吗?!?

    修改 抱歉,如果你很久以前就找到了,但我会试一试:Could not MERGE resource on COMMIT (Apache 2.0.55)是Google为我找到的东西:)

    OP在那里写道“Apache指示要使用的APR版本”。这意味着在编译SVN时必须引用正确的APR版本。我在我的系统(OS X 10.6)上通过MacPorts安装了SVN(v1.6.9)。我没有在本地使用WebDAV或Apache,但我安装了APR 1.3.12_1(仅供参考)。 OP建议在编译SVN时使用--with-apxs=/path/to/bin/apxs虽然我不确定这是否适用于您的情况(我很久以前就开始猜测,您可能会注意到:)。

    你有可能检查Apache期望的APR版本与用于构建SVN的APR版本(例如,如果您使用的是MacPorts,可以使用sudo port installed apr查看系统上的APR版本)?< / p>

    仅供参考,摘自Building Apache the Way You Want It

      

    apxs是一个独立的实用程序   无需动态编译模块   需要使用configure脚本   或者拥有Apache源代码   可用。它确实需要Apache的   但是,头文件被复制了   到定义的位置   安装Apache时--includedir但是,使用apxs很重要   那是用同样的方式建造的   配置选项为Apache ;   否则,它会犯错误   关于Apache的地方的假设   各种安装位置都是。

答案 1 :(得分:1)

我有两个关于问题可能隐藏的想法,当然是猜测,所以请注意。

一方面,它可能只是文件权限问题。我知道,这听起来很愚蠢,但也许有一些配置文件,或者一个钩子作为方案建议,甚至是存储库结构中的一些文件夹,由于更新到10.6或构建新的svn版本而无法读取,所以我仔细检查一下。

第二个想法是检查svn工作的copy-client-server-repository版本的兼容性。来自颠覆的人发誓,1.51.6都不会破坏存储库级别的兼容性1.4(尽管他们在工作副本上这样做)。但是检查整个堆栈的格式是否一致并不会有什么坏处。当你在它的时候,确保你构建的apache库与10.6附带的apache 2.2.11兼容(同样,它们应该,但你永远不知道)

最后,祝你好运。

答案 2 :(得分:1)

首先建立基线。在Snow Leopard(10.6.3)的库存中,这正是我所做的。

使用内容

创建“/etc/apache2/other/svn.conf”
LoadModule dav_svn_module /usr/libexec/apache2/mod_dav_svn.so
<Location /svn>
    DAV svn
    SVNParentPath /usr/local/svn
    AuthType Basic
    AuthName "Subversion repository"
    AuthUserFile /usr/local/svn/htpasswd
    Require valid-user
</Location>

创建了subversion文件夹和存储库“test”:

sudo mkdir /usr/local/svn
sudo svnadmin create /usr/local/svn/test
sudo chown -R _www:_www /usr/local/svn
sudo htpasswd -cb /usr/local/svn/htpasswd testuser testpass

来自普通用户,主目录:

macmini:~ jclark$ mkdir Checkout && cd Checkout
macmini:Checkout jclark$ svn --username testuser checkout http://localhost/svn/test
Authentication realm: <http://localhost:80> Subversion repository
Password for 'testuser':
Checked out revision 0.
macmini:Checkout jclark$ cd test && touch test.txt && svn add test.txt && svn commit -m 'test' test.txt
A         test.txt
Adding         test.txt
Transmitting file data .
Commited revision 1.
macmini:test jclark$

现在,如果所有这些都能正常工作,那么你有一个由apache服务的工作库存1.6.5 subversion存储库。如果没有,那么你最有可能将苹果提供的svn二进制文件/库与你自己的(macports等)混合存在权限问题。确保确定您正在使用Apple提供的二进制文件。 Apple确实略微修改了源代码,而且在过去将'ports'与'stock'混合时遇到了兼容性问题。至于权限,apache以用户_www,group _www的形式运行。确保所有文件和目录都是这样拥有的,并且不要忘记在使用svnadmin或其他东西直接操作svn存储库时更新它们。

由于这是有效的,将你的'svn2'存储库移回/ usr / local / svn(如果你还没有),在某处做一个干净的检查,并尝试提交测试。

如果您仍遇到问题,请尝试升级存储库。

sudo svnadmin upgrade /usr/local/svn/svn2
sudo chown -R _www:_www /usr/local/svn/svn2

重复结账/提交测试。

作为最后的手段,请再次转储并加载存储库。

sudo svnadmin dump /usr/local/svn/svn2 > /tmp/svn2.dump
sudo svnadmin create /usr/local/svn/svn3
sudo svnadmin load /usr/local/svn/svn3 < /tmp/svn2.dump
sudo chown -R _www:_www /usr/local/svn/svn3

重复结账/提交测试,这次使用/ svn / svn3。

享受您的固定存储库...希望:)

<强>更新

subversion命令行客户端中可能存在错误。做完之后:

mkdir \!vcc && touch \!vcc/default
svn add \!vcc && svn commit -m 'test'
svn log

注意svn log的输出(至少对我来说)是什么都没有。来自乌龟的Svn日志很好,这表明服务器(如上面的设置)正常工作。

要尝试的另一件事是通过'file'而不是'http'访问存储库。将整个存储库复制到您的主目录或您的用户所有者的某个位置,然后检查它(即svn checkout / Users / Shared / svn / svn2)并尝试提交。

答案 3 :(得分:0)

您是否尝试过Versions适用于OSX的SVN客户端?它不是你的问题的解决方案,但可能是另一种选择。我和我的团队在使SVN和OSX相互通信方面存在一些问题,因此寻找替代客户端和版本对我们来说非常有用。

答案 4 :(得分:0)

chown -R apache:apache svn

chmod -R 770 svn

答案 5 :(得分:0)

这解决了我的冲突:我备份了我的本地文件,然后从服务器中取出所有内容。然后,当我插入并推送我的备份文件时,409冲突错误没有再次出现。

此致 凯文