我想要备份多个文件夹。 我想要排除这些文件夹中所有包含子目录的目录.git
。 例如,在此文件夹层次结构中:
├── gitrepo <-- exclude this completely
| └── .git/...
│ └── file1
└── nogitrepo <-- keep this
└── file2
我已经成功地用 排除了所有 .git 目录--exclude=.git
,但由于本地存储库的所有内容恰好已经在远程 SCM 中,因此我不想将它们包含在我的备份中。
我知道--filter
rsync 的参数。我查看了手册页,但我不确定它是否能解决这个问题。但我很乐观,因为 rsync 事先汇编了所有包含文件的文件列表。
那么,是否可以使用 rsync 排除所有属于 git 存储库的文件夹?类似于每个目录的规则--filter
?
答案1
设置您的SRC
和DEST
变量,例如:
SRC="./"
DEST="../BACKUP/"
您可以使用类似的方法find
来定位所有.git
目录:
find "${SRC}" -type d -name '.git'
虽然这${SRC}/.git
也将包括(将成为${SRC}
,从而最终忽略“一切“)...避免使用-mindepth 2
:
find "${SRC}" -mindepth 2 -type d -name '.git'
接下来剥离尾随/.git
组件:
find "${SRC}" -mindepth 2 -type d -name '.git' \
| sed -re 's!/.git$!!g'
由于rsync
将其工作目录设置为源,我们${SRC}
也需要从结果中修剪初始值:
find "${SRC}" -mindepth 2 -type d -name '.git' \
| sed -re 's!^'"${SRC}"'!!g;s!/.git$!!g'
最后,将其与rsync
命令连接起来,使用--exclude-from
并传递-
(即:)stdin
:
find "${SRC}" -mindepth 2 -type d -name '.git' \
| sed -re 's!^'"${SRC}"'!!g;s!/.git$!!g' \
| rsync -av --exclude-from - "${SRC}" "${DEST}"/
笔记:这不会好转任何未跟踪/修改的文件。
答案2
find your_DIR_for_BACKUP -name .git | sed 's/\/.git//g' > ~/exclude_repos
并使用 --exclude-from 选项运行 rsync,选择已填充的文件 ~/exclude_repos
rsync --exclude-from ~/exclude_repos your_DIR_for_BACKUP_SRC DST