1

我们使用 SVN 服务器 1.6.9 作为我们的开发存储库。但是从本周开始,我们发现一些修订的日志丢失了:

$ svn log http://svn.mywork.com/svn/my_system/branches/A01 -l 3
------------------------------------------------------------------------
r675 | yin.su | 2012-11-14 10:21:03 +0800 (Wed, 14 Nov 2012) | 1 line

instant msg model impl 
------------------------------------------------------------------------
r602 | svnsync | 2012-10-26 19:47:29 +0800 (Fri, 26 Oct 2012) | 1 line


------------------------------------------------------------------------

所以r602的日志信息不见了。此外,我们尝试使用“svn propget”来检索日志消息:

$ svn propget svn:log --revprop -r 602 http://svn.mywork.com/svn/my_system/branches/A01

然后什么都没有返回。

如果我们将 PEG 修订添加到 url,则返回 msg:

$ svn propget svn:log --revprop -r 602 http://svn.mywork.com/svn/my_system/branches/A01@HEAD
This is my SVN log message

但是在“svn log”命令中将 PEG 修订添加到 url 仍然不起作用。

在 r602 中,我们实际上使用“svn merge”命令将分支 B01 合并到 A01。所以我们很困惑为什么向 propget cmd 添加 PEG 修订版有效,为什么“svn log”cmd 中缺少 r602 log msg?

谢谢!

4

3 回答 3

1

完全可以提交没有日志消息或包含几个空格的日志消息的 Subversion 修订,只是为了让 Subversion 不询问您是否要在没有日志消息的情况下提交:

$ svn commit -m" "

您确定应该有日志消息吗?

此外,它也可以svn pset用来完全删除日志消息。你的用户有能力使用svn pset --revprops吗?

尝试以--xml格式获取输出。这样,您可以查看日志消息是否真的丢失或者只是几个空格。

$ svn log --xml -v -r602 $REPO | less
于 2012-11-21T15:55:10.787 回答
0

下面的 FAQ 中的条目值得一读,因为它不是我期望的 svn log 的行为。 http://svn.apache.org/repos/asf/subversion/branches/server-l10n/www/faq.html#hidden-log

我看不到我刚刚提交的文件的日志条目。为什么?

假设您在存储库上运行“svn checkout”并收到修订版 7(又名 r7)的工作副本,其中包含一个名为 foo.c 的文件。您修改文件并成功提交。发生两件事:

The repository moves to r8 on the server.
In your working copy, only the file foo.c moves to r8. The rest of your working copy remains at r7.

您现在拥有所谓的混合修订工作副本。一个文件位于 r8,但所有其他文件都保留在 r7,直到它们也被提交,或者直到运行 'svn update'。

   $ svn -v status
   7        7 nesscg       .
   8        8 nesscg       foo.c
   $

如果您运行不带任何参数的“svn log”命令,它会打印当前目录的日志信息(在上面的清单中名为“.”)。由于目录本身仍位于 r7,因此您看不到 r8 的日志信息。

要查看最新日志,请执行以下操作之一:

Run 'svn log -rHEAD'.
Run 'svn log URL', where URL is the repository URL.
Ask for just that file's log information, by running 'svn log foo.c'.
Update your working copy so it's all at r8, then run 'svn log'.
于 2013-10-09T05:08:16.930 回答
0

抱歉回来晚了!问题终于解决了。根本原因是Apache身份验证配置错误!

现象是只丢失了merging log msg,于是我试着看了一下Apache的访问日志,发现是这样的:

10.14.21.75 - - [22/Nov/2012:13:22:05 +0800] "OPTIONS /svn/opencore/branches/ali00304473_Other_20120426_opencore HTTP/1.1" 200 192
10.14.21.75 - - [22/Nov/2012:13:22:05 +0800] "PROPFIND /svn/opencore/branches/ali00304473_Other_20120426_opencore HTTP/1.1" 207 772
10.14.21.75 - - [22/Nov/2012:13:22:05 +0800] "PROPFIND /svn/opencore/!svn/vcc/default HTTP/1.1" 207 1040

请求中未识别用户名!然后我发现分支的 SVN 访问权限设置为允许每个人阅读:

[opencore:/branches/ali00304473_Other_20120426_opencore]
* = r

此外,在 中httpd.conf,它的配置如下:

<Location /svn/>
        DAV svn
        SVNParentPath /home/admin/svnroot
        AuthBasicProvider file ldap
        AuthType Basic
        .....
        AuthUserFile /home/admin/svnfiles/svn-auth-file
        Satisfy Any
        Require valid-user
        AuthzSVNAccessFile /home/admin/svnfiles/svn-access-file
</Location>

因此,无论是更改* = r" to "* =SVN 访问文件中的“”,还是将“满足任何”更新为“满足所有”都可以解决问题。

结论:在我们之前的配置(bad config)中,当一个 SVN HTTP 请求(没有 auth 信息)到达服务器时,它首先由 Apache httpd 处理。因为httpd被配置为“满足任意”,所以“Require valid-user”不是必须的选项,所以请求被转发到MOD_SVN。由于分支对每个人都开放(* = r),因此 MOD_SVN 没有将身份验证请求发送回 SVN 客户端,然后尝试从存储库中获取日志。但是获取 SVN 日志需要身份验证/授权令牌,因此 MOD_SVN 只是在模块内部默默失败,httpd 只是向客户端返回空日志消息。

于 2013-01-11T06:35:38.893 回答