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

相關內容