Bitbucket流水线中使用rsync部署时,如何包含/web目录全部内容并排除/web/uploads目录(避免远程uploads目录被清空)
Bitbucket流水线中使用rsync部署时,如何包含/web目录全部内容并排除/web/uploads目录(避免远程uploads目录被清空)
嗨,我来帮你解决这个问题!你遇到的情况其实是rsync过滤规则的顺序和匹配逻辑导致的——你现在的规则先写了+ /web/***,这会让/web/uploads下的内容也被匹配到包含规则里,后面的排除规则就失效了。再加上本地仓库里的/web/uploads是空的,rsync默认会把远程对应目录的内容同步成和本地一样,也就是清空远程的uploads目录。
给你两个可行的解决方案,你可以根据情况选择:
方案一:调整过滤规则的顺序和写法
把排除规则放在包含规则前面,明确排除/web/uploads目录及其所有内容的同步,这样rsync就会完全忽略这个目录,既不会上传本地的空目录,也不会删除远程已有的内容。
修改你的bitbucket-pipelines-filter.txt内容为:
- /web/uploads/*** - /web/uploads/ + /web/***
解释下规则的作用:
- 第一行
- /web/uploads/***:排除/web/uploads目录下的所有文件和子目录 - 第二行
- /web/uploads/:排除/web/uploads目录本身的同步,避免本地空目录覆盖远程目录 - 第三行
+ /web/***:包含/web目录下的所有其他内容
方案二:在rsync命令中直接添加排除参数(无需修改filter文件)
如果你不想改动filter文件,也可以在rsync命令里直接追加--exclude='/web/uploads/'参数,这样更直接:
rsync --filter=merge ${BITBUCKET_CLONE_DIR}/bitbucket-pipelines-filter.txt --exclude='/web/uploads/' [你的其他rsync参数] [目标部署地址]
这个参数会让rsync完全跳过/web/uploads目录的同步,不管本地目录是什么状态,远程的内容都不会被改动。
另外要注意:如果你的rsync命令里用到了--delete参数(用来删除远程存在但本地没有的文件),一定要确保排除规则生效,否则--delete还是会清空远程的/web/uploads。上面的两种方案都能和--delete兼容,因为被排除的目录不会被--delete处理。
你可以先试试方案一,调整filter文件的规则顺序,应该就能解决远程uploads目录被清空的问题了!
备注:内容来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

