我是一名web开发人员。我在自己的机器上编辑本地svn工作副本中的文件,我们的开发服务器是通过samba共享的磁盘,服务器的根目录也是工作副本,我想做的是每当开发人员提交一些代码时,使用客户端svn post-commit钩子自动更新服务器上的工作副本。我发现有两个批处理文件可以正确地做到这一点,一个使用subversion命令,另一个使用Tortoise SVN命令,但问题是两个批文件都更新了整个工作副本,而不是更改的文件,这非常慢,通常需要一两分钟。所以我认为如果我只能更新更改后的文件,可能会更快。或者mybe,将批处理文件制作成ssh到服务器并直接更新(而不是通过samba)更好吗?如何做到这一点?
很抱歉我的英语不好,如果有任何帮助,我们将不胜感激。
您可以执行以下步骤:
1.使用svnlook命令查找更改的文件
svnlook changed REPOSITORY NAME
- 将命令的输出获取到一个文件中
- 动态读取此文件并将其提取到SVN更新命令中
我可以告诉你如何在Linux中做到这一点,但不清楚批处理文件。
我遇到了类似的问题,但Linux服务器托管SVN。也许你可以从这里获得一些线索,并将其更改为与你的Windows系统相匹配。
POST_COMMIT
#!/bin/sh
wget http://localhost/update_svn.php
update_svn.php
<?php
$output = shell_exec('/media/disk3/velsvn/projects/hooks/svn_update_step1.sh');
echo "<pre>$output</pre>";
?>
svn_update_step1.sh
ssh -i /media/d/mykey/id_rsa velsvnuser@localhost /media/disk3/velsvn/projects/hooks/svn_update_step2.sh
svn_update_step2.sh
#!/bin/sh
cd /media/disk3/velsvn/projects/hooks
rm -f filelist
rm -f log
whoami >> log
svnlook dirs-changed /media/disk3/velsvn/projects/ | sed "s/^..//" | awk '{ print substr( $0, 9 ) }' >> /media/disk3/velsvn/projects/hooks/filelist; sed -i -e 's#^#/media/disk2/www/htdocs#' filelist; cat /media/disk3/velsvn/projects/hooks/filelist | xargs /usr/bin/svn up -N >> /media/disk3/velsvn/projects/hooks/log
注意:1./media/d/mykey/id_rssa是为SSH访问生成的密钥。这确保了系统不会等待用户提供连接到SVN的密码以及执行shell脚本。2.POST-COMMIT文件和shell文件sh1和sh2被赋予+x mod,以便它们可以被执行。
请随时对这篇文章发表评论,并提供一个更好看的解决方案。我现在所知道的是,这个解决方案有效:)