我正在寻找一种方法来备份我们所有的 SVN 存储库,然后遇到了这个问题: http://www.darcynorman.net/2006/04/05/automatically-backing-up-multiple-subversion-repositories/
因为我们的存储库是按照客户端/项目目录结构组织的,所以我将脚本更改为如下形式:
#!/bin/sh
SVN_REPOSITORIES_ROOT_DIR="/var/svn/repos/"
BACKUP_DIRECTORY="/home/hyperactive/public_html/svn/"
for CLIENT in `ls -1 $SVN_REPOSITORIES_ROOT_DIR`
do
echo 'dumping client: ' $CLIENT
mkdir $BACKUP_DIRECTORY/$CLIENT
for REPOSITORY in `ls -1 $SVN_REPOSITORIES_ROOT_DIR/$CLIENT`
do
echo 'dumping repository: ' $REPOSITORY
svnadmin dump $SVN_REPOSITORIES_ROOT_DIR$CLIENT/$REPOSITORY | gzip > $BACKUP_DIRECTORY$CLIENT/$REPOSITORY'.gz'
done
运行它之后(它成功完成了备份),我在每个要备份的存储库上都收到以下错误:
<m:human-readable errcode="2">
Could not open the requested SVN filesystem
</m:human-readable>
我查看了 Apache 错误日志,发现了以下内容:
(20014)Internal error: Can't open file '/var/svn/repos/Test2/Test3.gz/format': No such file or directory, referer: http://10.4.2.254/svn/Test2
在我看来,备份脚本以某种方式添加了.gz在 repo 路径的末尾 ([...]Test2/Test3**.gz**)。进一步检查后,我注意到脚本中 .gz 扩展名周围有单引号。
有什么想法吗 ?
答案1
好的,我现在感到非常尴尬......似乎一切都还好,但是因为我有一个绝妙的想法,将备份保存在 public_html/ 中,并且与存储库具有完全相同的目录结构,并且在 Apache conf 文件中有一个,所以 .gz 文件以某种方式被视为存储库。
为了澄清起见,我有以下备份结构:
public_html/
svn/
CLIENT/
PROJECT.gz
...这是针对存储库的:
/var/svn/repos/
CLIENT/
PROJECT/
在 Apache conf 文件中我有:
<Location /svn>
DAV svn
[...]
当我使用浏览器导航到 /svn 时,我遇到了指定的错误。重命名或从 public_html/ 移动备份文件夹解决了问题,但让我感到很愚蠢。
答案2
如果您进入 /var/svn/repos,备份档案是否列在那里?/var/svn/repos/Test2/Test3.gz 不应该存在;它只存在于 /home/hyperactive/public_html/svn
答案3
在脚本中-澄清:
存储库布局如下:
/var/svn/repos/CLIENT/REPOSITORY_NAME?您的示例中,Test2 是客户端,Test3 是存储库?不清楚。
删除这些文件夹应该可以解决问题(我建议在实际运行 rm 之前移动它们)
for CLIENT in `ls -1 $SVN_REPOSITORIES_ROOT_DIR`
do
echo 'dumping client: ' $CLIENT
mkdir $BACKUP_DIRECTORY/$CLIENT
完成循环的 done 在哪里?它没有添加到问题中 - 我假设它在文件末尾。
添加带有单引号的 '.gz' 以确保 .gz 被添加到 gzip 文件中,而不是变量 $REPOSITORY 的一部分
我自己运行了这个脚本 - 而且它运行良好。
旧答案
您是否已解压备份?
该行svnadmin dump $SVN_REPOSITORIES_ROOT_DIR$CLIENT/$REPOSITORY | gzip > $BACKUP_DIRECTORY$CLIENT/$REPOSITORY'.gz'
转储 subversion 存储库,然后将其压缩为一个较小的文件。尝试运行unzip REPOSITORY.gz
,您的文件夹结构就会显示出来。