SVN和它的post-commit钩子有一个奇怪的问题。
我们有一些网站,这个问题只影响一个(至less我发现)。 这个代码有一个post-commit钩子:
#!/bin/sh REPOS="$1" REV="$2" WC=/srv/www/sites/sitename date | tee -a $REPOS/hooks/log.txt cd $WC && svn update 2>&1 >> $REPOS/hooks/log.txt echo | tee -a $REPOS/hooks/log.txt
挂钩运行,当我提交; 该目录存在; 和它运行的用户具有访问该目录的正确权限(我已经调整了钩子的代码以回显两个日志文件来检查。)
当我su到用户,并切换到目录,我可以运行svn update – 它将更新与最新的版本。 当我通过钩子做的时候,它不会。
我做了一些戳,发现钩子运行时,触发svn update ; 但是对刚刚提交的新版本没有做任何事情。 我从目标目录中删除了一个文件,并提交了一个更改 – 文件被恢复了,但是从之前的版本 – 我手动更新的最后一个版本。
显然有一些奇怪的事情,但我不知道是什么。 资源库的configuration看起来不错,但是我对SVN的了解不够深入。 我会很感激任何人可能有什么提示下一步看什么。
编辑
svn info给我:
URL: file:///srv/svn/repos/sitename/trunk Repository Root: file:///srv/svn/repos/sitename Repository UUID: 8f30e7d8-358c-4aa0-ba90-4bb80c6b434e Revision: 132 Node Kind: directory Schedule: normal Last Changed Author: authorname Last Changed Rev: 132 Last Changed Date: 2013-06-17 09:47:46 -0400 (Mon, 17 Jun 2013)
日志文件的输出没有帮助; 当我只是提交文件,我看到:
Mon Jun 17 10:05:08 EDT 2013
这是上次提交的时间。 svn update不会将任何内容输出到日志文件中。
我刚刚创build了一个新的版本 – 我已经添加了一个新的文件到我的本地版本库,并从目标目录中删除了README 。 这给了我在日志文件中的以下内容:
Mon Jun 17 10:11:44 EDT 2013 Restored 'README'
我刚刚提交的版本是134.没有新文件的迹象, svn info告诉我最后更改的logging仍然是132。
再次编辑
我已经添加了一些debugging代码钩,如要求:
echo $@ >> /tmp/tempfile; env | tee -a /tmp/tempfile;
这给了:
/srv/svn/repos/sitename 150 OLDPWD=/ PWD=/srv/www/sites/sitename
150是我刚刚添加的修订版本。
再次编辑
按照要求。 第一个是我做了改变并承诺的(没有更新); 第二个是我删除一个文件后,再次提交(该文件已恢复,但从一个较早的版本)
/srv/svn/repos/sitename 153 OLDPWD=/ PWD=/srv/www/sites/sitename /srv/svn/repos/sitename 154 OLDPWD=/ PWD=/srv/www/sites/sitename
再次编辑
我创build了一个新的工作目录,并以www数据login。 我以同一个用户的身份进行了初始结账。 然后犯下。 和svn update没有做任何事情。
我尽我所能,这不是一个明显的文件权限错误。 挂钩肯定是运行svn update命令,因为当我从工作目录中删除一个文件并运行一个提交,它正在恢复我删除的文件。
就好像svn没有看到新版本。 我目前使用的命令是:
REPOS="$1" REV="$2" WC=/srv/www/sites/sitename /usr/bin/svn update -r $REV "$WC" 2>&1
$1是正确的存储库名称。 $2是正确的最新版本号。 $WC是正确的目录。
svn commit作为正确的用户,在正确的目录中,它正确更新 为了完善,我也尝试使用版本号的旧版本。 当我做了/usr/bin/svn update -r 10 "$WC" 2>&1 [约140版本之前],它没有任何更改 – 没有删除,没有添加任何东西。
更新第五个
将svn update添加到cron中,与post-commit挂钩启动时完全相同。 它会更新到我运行svn update的最后一个版本,但是更新的版本将被省略。 如果工作目录和最后一个版本没有区别,它什么都不会做。 是的,cron正在运行。 我试图以正确的用户身份和作为根源,在这一点上有点挫败。
另外,我刚刚重新创build了仓库和工作目录。 我将我的本地工作目录中的内容添加到新的回购库,并且其行为方式完全相同。 即使这个设置和我今天早上build立的一个不同的开发站点是一样的。
所以我放弃了这一点。 试图解决这个问题的麻烦远远超过偶尔手动更新它的不便之处。 谢谢大家阅读这个,并为您的build议。
为什么不每隔几分钟就有一个cron作业来更新工作副本。 它会绕过你作为一个post commit钩子所遇到的麻烦,而且这将节省开发者在每次提交时都必须等待svn更新完成的麻烦。