Rsync 除了 .svn 文件夹及其子内容之外?

Rsync 除了 .svn 文件夹及其子内容之外?

处理一个颠覆存储库和一个不太了解其工作原理的新用户。

长话短说,由于它们的本地结构由于复制随机 .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 过滤器:仅复制一种模式一些提示。

在这种特殊情况下,不包括版本控制目录是获得您想要的东西的快速方法。

相关内容