我想備份多個資料夾。在這個多個資料夾中,我想排除所有包含子目錄的目錄.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