我经常需要使用 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
.这是否可能无需再次比较两端的文件列表?