0

我做了一些功课,虽然我可以回答以下关于在 Windows 上导出 SVN 存储库(使用 VisualSVN 服务器)的所有问题,但我完全迷失在 Linux 上,因为我是那里的新手。

我想在 Linux 上使用 SVN 的导出功能,以便在每次提交存储库时更新网站。但这样做存在一些问题。

我已经阅读了这三个: 如何使用“svn export”命令从存储库中获取单个文件? http://www.duchnik.com/tutorials/2011/07/02/svn-command-reference http://www.picksourcecode.com/ps/ct/161055.php

并想出了在提交后挂钩中使用的以下命令:

svn export --force svn://localhost/repository_name /share/Web/projects/website

问题:

  1. 任何人都有任何想法,为什么它不起作用?更改已提交到存储库,但操作以“提交后挂钩失败(退出代码 255)且无输出”告终。并且 post-commit 钩子似乎没有被触发,因为目标网站没有更新。我已经检查(甚至仔细检查)该命令本身就像一个魅力(从命令行调用时)。它只在提交后挂钩内失败。我试图在这个文件的末尾添加“exit 0”。当然它是可执行的。没运气。尽管如此,经过多次尝试,相同的错误代码。

  2. 为什么这个操作有效,即使我没有提供用户名和密码作为参数?存储库中的“passwd”文件已正确设置,来自外部客户端的任何操作都需要提供用户名和密码,否则会失败。SVN中的一些错误?

  3. 有没有办法将导出到目标的文件限制为仅更改/添加/删除,而不是在每次提交后导出整个存储库?

  4. 有没有做完全相同的事情(导出),但是通过 FTP 到外部服务器,而不是我的 QNAP 的本地路径?

对于第 3 点和第 4 点,我尝试使用 SourceForge 形式的 svn2web 工具,但这是一个相当糟糕的主意,而且它不起作用。它使用 pre-commit 钩子而不是 post-commit,这意味着其中的任何错误都会阻止开发人员提交他们的工作(在我的例子中 - post-commit - 提交更改,只是不会传播到目的地)。他们的预提交挂钩在我的服务器上失败(与上述第一点相同的错误消息)并且他们将“svn2web”属性添加到文件夹属性的方法(解决方案)可能适用于纯 Linux Subversion 客户端,但在使用时似乎完全失败了Windows 上的 TortoiseSVN 作为 SVN 客户端。

我想知道,如果问题 1(和 2-3,也许是 4)的解决方案不是在 /share/Web/projects/website 中设置本地工作副本并使用 CRON 定期更新此存储库?这将始终仅“导出”实际更改,并且可能会在没有弹出登录名和密码的情况下失败。但这似乎是在重新发明轮子或强迫打开已经打开的门。

预先感谢您的任何帮助。

4

1 回答 1

1

一些简短的答案:

  1. 我会认为您正在以不同于 SVN 守护程序 (svnserve) 用于运行钩子的用户身份运行此命令。那个其他用户(由 SVN 使用)可能没有获得运行导出所需的所有权限。

  2. Unfortunately, I have no idea. Must be something with your installation of SVN. Of course, this shouldn't happen at all. If repository is properly secured and requires login + password, everyone has to provide it corectly, even for export operation.

  3. You need and extended script, preferebly run as post-commit hook, that will compare current (last one - HEAD) revision with provious one and will export only changed files. This isn't an easy task. Look around in the Internet for ready solutions, before you try to discover wheel again! :]

  4. No directly with extract command of SVN? The easiest way, that comes my mind is to extract to a local path, pack it, send it via FTP and unpack it at destination. Or send directly, file-by-file, if you don't have access to shell at destination, to unpack an archive.

Hope, these will help? :]

于 2012-07-04T10:06:58.350 回答