📌 背景规则

rsync 的匹配逻辑是:

  1. 遍历目录时,如果某个目录被排除了,它下面的文件/目录就不会再被扫描

  2. 所以如果你只写 --include='uploads/***',但没有告诉 rsync 要“保留进入 uploads 目录”,那 rsync 可能根本不会进入这个目录。

  3. 因此要写两个 include:

    • --include='uploads/' → 允许进入 uploads 目录本身
    • --include='uploads/***' → 允许 uploads 目录下的所有内容

--include 推荐写法

如果是“排除其它,只保留 uploads”,写法通常是:

rsync -av --delete \
   --include 'uploads/' \
   --include='uploads/***' \
   --exclude='*'
   --dry-run \
   /mnt/hgfs/e/phpstudy_pro/WWW/project_dev/ \
   /mnt/hgfs/e/phpstudy_pro/WWW/project/

🚀 意思是:

  • 允许 uploads/ 目录和里面的所有内容
  • 其他一律排除

--exclude 推荐写法

如果你想完全排除 .git,推荐写法:

rsync -av --delete \
    --exclude '.git/' \
    --dry-run \
    /mnt/hgfs/e/phpstudy_pro/WWW/project_dev/ \
    /mnt/hgfs/e/phpstudy_pro/WWW/project/

🚀 这样 rsync 会直接忽略整个 .git 目录。

✅ 排除指定后缀文件

--exclude '*.dev.php'

🚀 这个规则会匹配 任意目录层级 下的 *.dev.php 文件。

也就是说:

  • /mnt/hgfs/e/phpstudy_pro/WWW/project_dev/a.dev.php ❌ 不会同步
  • /mnt/hgfs/e/phpstudy_pro/WWW/project_dev/b/a.dev.php ❌ 不会同步
  • /mnt/hgfs/e/phpstudy_pro/WWW/project_dev/b/c/d/a.dev.php ❌ 不会同步

只要文件名以 .dev.php 结尾,无论在多少层目录里,都会被排除。

rsync -av --delete \
    --exclude '.git/' \
    --exclude '.idea/' \
    --exclude 'softs/' \
    --exclude 'docs/' \
    --exclude 'uploads/' \
    --exclude '*.dev.php' \
    --dry-run \
    /mnt/hgfs/e/phpstudy_pro/WWW/project_dev/ \
    /mnt/hgfs/e/phpstudy_pro/WWW/project/