颠覆部分导出

时间:2020-03-05 18:47:11  来源:igfitidea点击:

我有一些有趣的发展情况。客户端和部署服务器位于防火墙内,无法访问Subversion服务器。但是开发人员不在防火墙范围内,并且可以使用Subversion服务器。现在,我已经解决的解决方案是更新代码的本地副本,然后使用UnleashIT提取最新更新的文件。

问题是如何仅从Subversion中获取更新的文件,以便它们可以通过防火墙进行物理传输并放置在部署服务器上。

我不担心尝试更改防火墙设置或者试图找出从防火墙内部访问Subversion服务器的简便方法。我只是对从最新更改的文件的存储库中部分导出的方法感兴趣。

还有其他建议吗?

找到的答案:除了我标记为"答案"的答案之外,我在这里还发现以下内容可以通过TortoiseSVN进行:

来自http://svn.haxx.se/tsvn/archive-2006-08/0051.shtml

* select the two revisions
* right-click, "compare revisions"
* select all files in the list
* right-click, choose "export to..."

解决方案

回答

我们不提供有关防火墙允许的信息。我对UnleashIT不熟悉。

我猜我们可能有一个从SVN导出到SVN服务器上的文件夹的脚本。然后,脚本会压缩导出的文件。然后,我们可以根据需要传输ZIP文件并将其解压缩到部署服务器。

TortoiseSVN支持代理服务器,因此我们可以从客户端使用其中之一?

回答

我们可以尝试使用Subversion二进制文件附带的svnadmin dump命令。我们可以使用此命令将整个存储库转储到文件(仅某些修订版或者一系列修订版)中。然后使用svnadmin load将转储文件加载到新的干净存储库中。

这不是一个完美的解决方案,因为它在存储库而不是单个文件方面起作用。

回答

所以,如果我理解正确...

假设我们有一个如下所示的存储库:

/
|+-DIR1
|   |- FILEa
|   |- FILEb
|+-DIR2
|   |- FILEc
|   |- FILEd
|- FILEe
|- FILEf

假设我们更新了文件" FILEa"," FILEc"和" FILEf",并将其提交回存储库中。然后,要从存储库中导出的是一个看起来像这样的结构:

/
|+-DIR1
|   |- FILEa
|+-DIR2
|   |- FILEc
|- FILEf

是对的吗?

回答

我们只希望位于防火墙后面的人员能够访问提交给Subversion的最新文件,对吗?

我们能否编写一个使用某种方法(可能是scp或者ftp)的svn钩子脚本,以便在提交文件时将文件发送到远程位置?

回答

Subversion钩子看起来很有希望。但是相对不了解如何编写该钩子脚本,我将如何取出已提交的文件并通过FTP将其保存在维护目录结构的位置?

如果我能做到这一点,那么防火墙内的某人可以将文件下载到部署服务器中,我们将很好。

回答

我发现rsync对于跨多个系统同步目录树非常有用。如果我们可以从开发工作站通过外壳访问服务器,则可以定期在本地检出代码并运行rsync,rsync将仅将已更改的文件传输到服务器。

(这是假设开发工作站上使用的是类似Unix的环境。Cygwin可以正常工作。)

cd deploy
svn update
rsync -a . server:webdir/

问题听起来像是我们实际上没有从开发工作站到服务器的任何直接网络访问权限,而我们真正要寻找的是一种让Subversion告诉我们哪些文件已更改的方法。 svn export支持一个参数,让我们仅签出在特定版本之间更改的文件。从svn帮助中:

-r [--revision] arg      : ARG (some commands also take ARG1:ARG2 range)
                             A revision argument can be one of:
                                NUMBER       revision number
                                '{' DATE '}' revision at start of the date
                                'HEAD'       latest in repository
                                'BASE'       base rev of item's working copy
                                'COMMITTED'  last commit at or before BASE
                                'PREV'       revision just before COMMITTED

我们需要跟踪复制到服务器的最新修订版本。假设它是SVN版本xxxx:

svn export -r xxxx:HEAD http://svn/

然后,只需将deploy目录的内容复制到现有文件之上的服务器即可。

这将无法处理已删除的文件,这在某些环境下可能会出现问题。

回答

svn export不接受修订范围,请尝试一下。

一个可能的解决方案是使用以下方法获取已更改文件的列表:

svn diff --summarize -rXXX http://svn/...

然后将它们导出。

回答

如果我们标记修订,这可能会帮助github svn-diff-export