使用 rsync 删除 .gitignored 文件

使用 rsync 删除 .gitignored 文件

我经常需要使用 rsync 将本地目录与可能的远程目录同步,同时忽略 git 由于其 .gitignore 配置而忽略的所有文件。

为此,我目前列出了与 git 复制相关的所有文件,然后将它们通过管道传输到 rsync。

cd $source
{ git ls-files -coz --directory --exclude-standard
  printf '.git\0'
} | rsync --info=progress2 -ar0 --files-from=- ./ "$destination"

将解析留给 git 本身,然后将文件列表通过管道传输到 rsync 有一些我依赖的优点。

  • 忽略文件的模式可能相当复杂,还涉及否定 ( !inverse-pattern-to-include),rsync 在此语法中无法理解。
  • .gitignore还应考虑放置在子目录中的文件。 Rsync 的merge-dir过滤器并不完全允许对此进行重构,因为对于 rsync 来说,包含和排除的顺序很重要。
  • .git/info/exclude还考虑了全局 git 配置文件,例如。
  • 它甚至可以在没有初始化 git 存储库的情况下工作,只需将 git 指向一个带有--git-dir.
  • 存储库可能非常大,因此将所有相关文件指定为 rsync--filter --exclude--include模式可能会突破命令行限制或严重减慢 rsync 速度。使用--files-from可以避免这种情况。

现在我需要改进此代码片段以支持 rsync 的--del标志,以删除$destination中丢失或排除的所有文件$source。不幸的是,它不能很好地与--files-from.这是否可能无需再次比较两端的文件列表?

相关内容