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