【发布时间】:2012-12-04 22:30:17
【问题描述】:
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 一样有效,至少在我找到的示例中,尽管不清楚语法是否是完全匹配的。 --filter=':- .hgignore' 不适用于 Mercurial;例如.hgignore 包含类似 ^target$ 的行(Git /target/ 的 Mercurial 等效项)不会被 rsync 识别为正则表达式。 Subversion 似乎没有任何效果,您必须解析 .svn/dir-prop-base 以获得 1.6 或更早版本的工作副本,并沮丧地举手获得 1.7 或更高版本的工作副本。
【问题讨论】:
-
听起来有点像为 rsync 提交一个增加对 .gitignore、.hgignore 等支持的补丁是个好主意。
-
@ThiefMaster:我提交了bugzilla.samba.org/show_bug.cgi?id=9744作为起点。
-
只是给其他人的说明,.gitignore 需要在 rysnc'd 的文件夹层次结构中,而不是在执行命令的目录中
-
:-到底是什么意思?冒号是什么意思?什么破折号? -
@David
:代表dir-merge(如果您在文件夹树的深处有.gitignore文件,则很有用),-代表exclude(过滤器也可以包括)。