我做了一些功课,虽然我可以回答以下关于在Windows上导出SVN repo的所有问题(使用VisualSVN服务器),但我完全迷失在Linux上,因为我是那里的新手。
我想在Linux上使用SVN的导出功能,每次提交存储库时都要更新网站。但是这有一些问题。
我已经宣读了这三个: How to use "svn export" command to get a single file from the repository? http://www.duchnik.com/tutorials/2011/07/02/svn-command-reference http://www.picksourcecode.com/ps/ct/161055.php
并找出了在post-commit hook中使用的以下命令:
svn export --force svn://localhost/repository_name /share/Web/projects/website
问题:
任何人都有任何想法,为什么它不起作用?更改将提交到存储库,但操作最终会以“提交后挂钩失败(退出代码255)而没有输出”结束。由于目标网站未更新,因此后提交挂钩似乎没有被触发。我检查过(甚至是双重检查)该命令本身就像一个魅力(从命令行调用时)。它只在post-commit钩子内失败。我试图在此文件的末尾添加“exit 0”。当然它是可执行的。没运气。经过多次尝试,仍有相同的错误代码。
为什么此操作有效,即使我没有提供用户名和密码作为参数?存储库中的“passwd”文件已正确设置,来自外部客户端的任何操作都需要提供用户名和密码,否则将失败。 SVN中的一些错误?
有没有办法将导出到目标的文件限制为仅更改/添加/删除,而不是在每次提交后导出整个存储库?
无论如何都要完全相同(导出),而是通过FTP而不是我的QNAP的本地路径到外部服务器?
对于第三和第四点,我尝试使用svn2web工具形式的SourceForge,但这是一个相当糟糕的想法,它不起作用。它使用预提交钩子而不是后提交,这意味着它中的任何错误都会阻止开发人员提交他们的工作(在我的情况下 - 提交后 - 提交更改,但不会传播到目标)。他们的预提交挂钩在我的服务器上失败(与上面第一点相同的错误消息),并且他们将“svn2web”属性添加到文件夹属性的方法(解决方案)可能适用于纯Linux Subversion客户端,但在使用时似乎完全令人烦恼Windows上的TortoiseSVN作为SVN客户端。
我想知道,如果问题1(以及2-3和4)的解决方案不是在/ share / Web / projects / website中设置本地工作副本并使用CRON进行perodic更新库?这总是“导出”只有实际的更改,如果没有poper登录名和密码,可能会失败。但这似乎是重新发明轮子或强迫打开已经敞开的大门。
提前感谢您的帮助。
答案 0 :(得分:1)
简要回答一下:
我认为你正在运行这个命令,因为不同的用户比SVN守护进程(svnserve)用来运行钩子。其他用户(由SVN使用)可能没有获得运行导出所需的所有权利。
不幸的是,我不知道。必须是安装SVN的东西。当然,这根本不应该发生。如果存储库得到适当保护并且需要登录密码,那么每个人都必须提供核心服务,即使是出口操作也是如此。
你需要和扩展脚本,最好是作为post-commit钩子运行,它将比较当前(最后一个 - HEAD)修订版本并且只导出已更改的文件。这不是一件容易的事。在尝试再次发现轮子之前,在互联网上寻找现成的解决方案! :
没有直接使用SVN的extract命令?最简单的方法,我想到的是提取到本地路径,打包它,通过FTP发送它并在目的地解压缩。或者,如果您无法访问目的地的shell,则逐个文件直接发送,以解压缩档案。