我有一个名为的脚本copy-site
,用于将站点从生产服务器复制到本地机器。copy-site example.net/httpdocs/ example.local/httpdocs/
将进行一次空运行 rsync;添加第三个参数true
是否进行真正的复制。
有时,本地文件已被编辑。在这种情况下,我想rsync
丢弃我的本地编辑,用服务器上的内容覆盖它们。但是,它通常不会这样做。它也不会在错误日志中显示任何相关内容。我尝试将 stderr 重定向到日志文件,但它通常是空的或包含有关无法访问远程服务器上的目录的警告;它没有提到不要覆盖某些文件。当然它可以访问这些文件:如果我删除本地副本,然后再次运行它,它会完美地创建它们,作为服务器上它们的完美副本。
我-I
今天添加了标志,但没有什么明显的区别。
#!/bin/bash
if [ "$3" = true ]
then
echo "real rsync";
echo "deleting files";
find $2 -type f -name ".*" -delete;
echo "rsync running now";
rsync -avziI --verbose --exclude-from /home/trig/copy-site-exclude -e 'ssh -p 2201' [email protected]:/var/www/vhosts/$1 $2 --append-verify --delete;
notify-send -i "$([ $? = 0 ] && echo terminal || echo error)" "copy site" "rsync complete";
echo "setting permissions";
chmod -R 0777 $2;
notify-send -i terminal "copy site" "full permissions granted";
else
echo "dry run rsync";
rsync -avziI --verbose --exclude-from /home/trig/copy-site-exclude -e 'ssh -p 2201' [email protected]:/var/www/vhosts/$1 $2 --append-verify --delete --dry-run;
notify-send -i terminal "copy site" "dry run complete";
fi
copy-site-exclude
仅仅是图像缩略图的列表(标识为以点开头),我不在乎传输它们,因为它们可以在本地重新生成。
custom/public/images/.*.jpg
custom/public/images/.*.png
custom/public/images/.*.gif
custom/public/images/.*.jpeg
我需要向 rsync 传递哪些标志以使其放弃所有本地更改,以便我的本地文件夹完美反映服务器上的源文件夹?
本地操作系统:Ubuntu。
服务器操作系统:CentOS。
答案1
好吧,简化命令(删除-z
和--append-verify
标志)似乎已经解决了问题。但是,我仍然想知道这里到底发生了什么。从我的阅读来看,这些标志不应该会导致无法覆盖(或删除)某些本地文件。
这条线路现在
rsync -avi --verbose --exclude-from /home/trig/copy-site-exclude -e 'ssh -p 2201' [email protected]:/var/www/vhosts/$1 $2 --delete;
我不确定这是答案(我已经解决了眼前的问题)还是新问题(为什么会发生这种情况?)。无论如何,我会把它留在这里。