Jes*_*ick 100 svn git mercurial rsync
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=:CCVS 一样好,至少在我发现的例子中,尽管不清楚语法是否完全匹配.--filter=':- .hgignore'对Mercurial不起作用; 例如,rsync不能将.hgignore包含类似^target$(Git的Mercurial等价物/target/)的行视为正则表达式.对于Subversion来说似乎没什么用,因为你需要.svn/dir-prop-base为1.6或更早的工作副本解析,并且为1.7或更高版本的工作副本沮丧地举手.
小智 107
正如luksan所提到的,你可以通过--filter切换到rsync.我实现了这个--filter=':- .gitignore'(在.gitignore之前有一个空格),它告诉rsync你做一个目录与.gitignore文件合并并让它们按照git的规则排除.您可能还想添加全局忽略文件(如果有).为了更容易使用,我创建了一个rsync包含过滤器的别名.
您可以使用它git ls-files来构建存储库文件排除的.gitignore文件列表.
https://git-scm.com/docs/git-ls-files
选项:
--exclude-standard考虑所有.gitignore文件.-o 不要忽略未分级的更改.-i 仅输出忽略的文件.--directory 仅在忽略整个目录时才输出目录路径.我唯一要忽略的是.git.
rsync -azP --exclude=.git --exclude=`git -C <SRC> ls-files --exclude-standard -oi --directory` <SRC> <DEST>
Run Code Online (Sandbox Code Playgroud)
经过数小时的研究,我找到了我所需要的:将目标文件夹与源文件夹同步(如果源文件夹中的文件被删除,也会删除目标文件夹中的文件),而不是将被忽略的文件复制到目标文件夹.gitignore,但也不要删除目标中的这些文件:
rsync -vhra /source/project/ /destination/project/ --include='**.gitignore' --exclude='/.git' --filter=':- .gitignore' --delete-after
Run Code Online (Sandbox Code Playgroud)
换句话说,此命令完全忽略来自 .gitignore 的文件,包括源文件和目标文件。--exclude='/.git'如果也想复制.git文件夹,您可以省略部分。
您必须从源复制 .gitignore 文件。如果您将使用 LordJavac 的命令,则不会复制 .gitignore。如果您在目标文件夹中创建一个文件,该文件应该被 .gitignore 忽略,尽管 .gitignore 将删除该文件。这是因为目标中没有 .gitignore 文件。但是如果你有这个文件,.gitignore 中描述的文件不会被删除,它们会被忽略,只是预期的。
rsync -ah --delete
--include .git --exclude-from="$(git -C SRC ls-files \
--exclude-standard -oi --directory >.git/ignores.tmp && \
echo .git/ignores.tmp')" \
SRC DST
Run Code Online (Sandbox Code Playgroud)
详细信息:--exclude-from是强制性的,而不是--exclude,因为排除列表的可能情况不会被解析为参数。从中排除需要一个文件,并且不能使用管道。
当前解决方案将排除文件保存在.git文件夹中,以确保git status在保持其独立性的同时不会影响它。如果愿意,欢迎使用/ tmp。
怎么样rsync --exclude-from='path/.gitignore' --exclude-from='path/myignore.txt' source destination?
它对我有用.
我相信你也可以拥有更多--exclude-from参数.