搭配.gitignore使用rsync模拟git pull时过滤与删除规则失效咨询
问题根源说明
你当前的命令配置存在两个典型的rsync规则认知误区,直接导致了两个同步异常:
- 源端删除未被gitignore收录的文件夹时,目标端无对应删除行为
这个异常和.gitignore规则配置完全无关:rsync默认的同步行为是仅将源端存在的文件复制到目标端,无论你配置了什么过滤规则,只要没有携带--delete系列参数,rsync永远不会主动清理目标端独有的文件或文件夹。 - 加了删除参数后,被gitignore收录的文件夹仍被从目标端删除
你使用的--filter=':- 路径/.gitignore'语法,仅会把.gitignore里的规则标记为排除不传输的规则,不会给这些路径附加保护不删除的属性。rsync开启--delete逻辑时,默认会扫描目标端所有未进入本次源端传输白名单的内容并删除——被exclude规则命中的路径因为不会进入传输白名单,会被rsync判定为目标端冗余内容直接删除,完全识别不到你需要保留这些被忽略内容的意图。
实现类git pull同步效果的正确配置
你需要的最终逻辑和git pull完全对齐:
- 所有被.gitignore标记的内容:不参与跨目录传输,同时永远不被rsync的删除逻辑清理
- 所有未被.gitignore标记的内容:源端存在的就同步到目标端,源端删除的就同步从目标端删除
对应的正确调整点: - 切换执行路径:把rsync的执行工作目录切到源目录(也就是opensource目录)下,让filter规则的路径匹配基准和git的相对路径逻辑完全一致,避免规则错位
- 双重加载.gitignore规则:一方面把.gitignore规则作为exclude规则(实现不传输被忽略内容),另一方面把同样的规则作为protect规则(实现保护被忽略内容不被删除)
- 搭配
--delete-after参数:在所有文件传输完成后,再清理目标端的冗余内容
正确命令示例
# 先切入源目录,保证路径基准和git一致 cd /你的实际路径/opensource rsync -avz \ --filter=':- .gitignore' \ --filter=':p .gitignore' \ --delete-after \ ./ ../testing
注意事项
- 不要使用
--delete-excluded参数,这个参数会强制删除目标端所有被exclude规则命中的内容,和你需要的保护逻辑完全相反 - filter规则的加载顺序会直接影响匹配优先级,把.gitignore对应的exclude、protect规则放在所有filter配置的最前面,能保证规则生效逻辑和git一致
- 该配置同步的是文件系统的实时状态,不需要依赖git仓库的提交记录,和git pull拉取代码的最终文件效果完全一致
内容的提问来源于stack exchange,提问作者Rafael Moreira
相关产品推荐
相关产品推荐

