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


2

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

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

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

我知道了 --filter rsync的参数。我查看了手册页,但我不确定它会解决这个问题。但我很乐观,因为rsync预先组装了所有包含文件的文件列表。

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

Answers:


0

设置你的 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}"/

注意: 这不会拿起来 任何 未跟踪/修改的文件。


0

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


最简约的答案,但也解决了!为了完整起见,也许只能添加 -d 目录标志到 find
0x00F
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.