处理一个颠覆存储库和一个不太了解其工作原理的新用户。
长话短说,由于它们的本地结构由于复制随机 .svn 文件夹而被搞乱,我执行了以下操作:
- 将本地结构复制到名为 staging 的文件夹中
- 从暂存目录中递归删除所有 .svn 文件夹
- 将存储库签出到“干净的文件夹”
现在我们处于最后一步 - 获取暂存文件夹内容以覆盖干净的内容。
我需要一个命令将暂存目录的内容复制到 clean 目录,删除 clean 目录中的所有内容,但保持 clean 文件夹的 .svn 文件夹不变。
这听起来像是 rsync 的工作。下面的命令正确吗?
rsync -avr --exclude=.svn* [staging] [clean]
答案1
rsync 的选项-C
可能就是您想要的。
不过,不要让手册页中的简短描述欺骗了您。看起来该选项仅适用于 CVS,但根据您的 rsync 版本,它会跳过几乎所有现有常见版本控制系统的文件。
# rsync version: 3.0.7
-C, --cvs-exclude auto-ignore files in the same way CVS does
...
The exclude list is initialized to exclude the following items
(these initial items are marked as perishable — see the FILTER
RULES section):
RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS
.make.state .nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak
*.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj *.so *.exe
*.Z *.elc *.ln core .svn/ .git/ .bzr/
then, files listed in a $HOME/.cvsignore are added to the list
and any files listed in the CVSIGNORE environment variable (all
cvsignore names are delimited by whitespace).
答案2
几乎——这应该是
rsync -av --exclude='.svn*' [staging] [clean]
或阻止 shell 扩展通配符的任何其他形式的引用。 (通配符只会匹配名称以 开头的不太可能的文件--exclude=.svn
,但最好不要冒险,并且即使 shell 配置为因不匹配的通配符而阻塞或将其扩展为空列表,也能正常工作。 )
-r
已经包含在-a
.多余的r
只是多余的,不会造成任何伤害。
--exclude
导致与其参数匹配的文件既不被复制,也不被考虑进行递归遍历。 rsync 的常见困难是反其道而行之,即排除目录中的某些部分。看Rsync 过滤器:仅复制一种模式一些提示。
在这种特殊情况下,不包括版本控制目录是获得您想要的东西的快速方法。