Rsync 包含一个漂亮的选项 --cvs-exclude
,可以“像 CVS 那样忽略文件”,但是 CVS 已经过时多年了。有没有办法使它也排除那些现代版本控制系统(Git、 Mercurial、 Subversion)会忽略的文件?
例如,我从 GitHub 签出了许多 Maven 项目。通常它们至少包含一个 .gitignore
列表 target
,这是默认的 Maven 构建目录(可能出现在顶级或子模块中)。由于这些目录的内容完全是一次性的,而且它们可能比源代码大得多,因此我希望在使用 rsync 进行备份时将它们排除在外。
当然,我可以显式地使用 --exclude=target/
,但是这样会意外地抑制不相关的目录,而这些目录恰好被命名为 target
,并且不应该被忽略。
我可以为磁盘上任何 .gitignore
、 .hgignore
或 svn:ignore
属性中提到的所有文件名和模式提供一个完整的绝对路径列表,但这将是一个庞大的列表,必须通过某种脚本才能产生。
由于 rsync 除了 CVS 之外没有对 VCS 签出的内置支持,那么有没有什么好的技巧可以提供给它它们的忽略模式呢?或者某种回调系统,通过它可以询问用户脚本是否应该包含给定的文件/目录?
更新 : 根据 LordJavac 的建议,--filter=':- .gitignore'
对 Git 的作用似乎和 --filter=:C
对 CVS 的作用一样好,至少在我发现的示例中是这样的,尽管还不清楚语法是否完全匹配。对于 Mercurial,--filter=':- .hgignore'
不能很好地工作; 例如,包含类似于 ^target$
(Mercurial 等效于 Git /target/
)的代码行的 .hgignore
不能被 rsync 识别为正则表达式。对于 Subversion,似乎没有什么是可行的,因为您必须为1.6或更早的工作副本解析 .svn/dir-prop-base
,并为1.7或更高的工作副本感到沮丧。