rsync 排除包含 .git 子目录的文件夹(--filter)

rsync 排除包含 .git 子目录的文件夹(--filter)

我想要备份多个文件夹。 我想要排除这些文件夹中所有包含子目录的目录.git。 例如,在此文件夹层次结构中:

├── gitrepo        <-- exclude this completely
|   └── .git/...
│   └── file1
└── nogitrepo      <-- keep this
    └── file2

我已经成功地用 排除了所有 .git 目录--exclude=.git,但由于本地存储库的所有内容恰好已经在远程 SCM 中,因此我不想将它们包含在我的备份中。

我知道--filterrsync 的参数。我查看了手册页,但我不确定它是否能解决这个问题。但我很乐观,因为 rsync 事先汇编了所有包含文件的文件列表。

那么,是否可以使用 rsync 排除所有属于 git 存储库的文件夹?类似于每个目录的规则--filter

答案1

设置您的SRCDEST变量,例如:

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

相关内容