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或更高版本的工作副本感到沮丧。
:-
是什么意思?结肠是什么意思?什么破折号?