12

我曾经在 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

奇怪的是,提交确实提交了更改,但工作副本没有看到这一点,一切都变得混乱了。

对于这个问题,我已经尝试搜索所有我能想到的变体,但搜索结果几乎毫无用处。我没有使用 TortoiseSVN 或任何特殊的东西,并且在新存储库上提交失败,所以我知道我的旧存储库没有问题。

任何帮助将不胜感激。

更新
我尝试将自动版本控制添加到我的 svn.conf 文件中。这是我的文件所说的:

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 部分(正如 scherand 建议的那样)。我正在使用 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。我能够检查它,进行更改并提交,没有任何问题。然后我尝试了我的旧存储库,它们也运行良好。

感谢大家的帮助!

4

6 回答 6

3

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

  1. 是否有任何提交前或提交后的钩子?
  2. 是否启用了“自动版本控制”?

如果有任何钩子,您确定它们不包含任何错误吗?您可以禁用它们进行测试吗?如果未启用 Autoversioning,您可以尝试启用它进行测试吗?这应该按照以下方式工作

<Location /repos>
  DAV svn
  SVNPath /var/svn/repository
  SVNAutoversioning on
</Location>

使用时mod_dav_svn(请参阅上面的 Autoversioning 链接)。

也许这有助于阐明您的问题,我们(和/或 Google :))可以从那里着手。

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

编辑: 如果你很久以前就发现了,我很抱歉,但我会试一试:Could not MERGE resource on COMMIT (Apache 2.0.55)是谷歌为我找到的东西:)

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

您是否有机会检查 Apache 期望的 APR 版本与用于构建 SVN 的版本(例如,sudo port installed apr如果您使用 MacPorts,您可以用来查看系统上存在哪些 APR 版本)?

仅供参考以您想要的方式构建 Apache 的摘录:

apxs是一个独立的实用程序,用于动态编译模块,无需使用configure脚本或拥有可用的 Apache 源代码。但是,它确实需要 Apache 的头文件,这些头文件被复制到 --includedir安装 Apache 时定义的位置。但是,重要的是使用apxs 与 Apache 具有相同配置选项的构建;否则,它会对 Apache 的各种安装位置做出错误的假设。

于 2010-04-07T06:11:53.353 回答
1

关于问题可能隐藏在哪里,我有两个想法,这当然是疯狂的猜测,因此请注意。

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

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

最后,祝你好运。

于 2010-04-07T11:43:25.023 回答
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>

创建颠覆文件夹和存储库“测试”:

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 确实稍微修改了源代码,我过去在将“ports”与“stock”混合时遇到了兼容性问题。至于权限,apache以用户_www,组_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 的输出(至少对我来说)什么都不是。来自 tortoise 的 svn 日志很好,这表明服务器(如上面的设置)工作正常。

要尝试的另一件事是通过“文件”而不是“http”访问存储库。将整个存储库复制到您的主目录或您的用户是所有者的某个地方,然后将其签出(即 svn checkout /Users/Shared/svn/svn2)并尝试提交。

于 2010-04-09T06:14:50.297 回答
0

您是否尝试过适用于 OSX 的 SVN 客户端版本?它实际上不是解决您的问题的方法,但也许是替代方法。我和我的团队在让 SVN 和 OSX 正常通信时遇到了一些问题,所以去寻找替代客户端,而版本对我们来说非常有用。

于 2010-03-30T18:04:38.293 回答
0
chown -R apache:apache svn

chmod -R 770 svn
于 2010-10-18T20:57:03.747 回答
0

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

问候,凯文

于 2014-05-29T18:09:43.163 回答