rsync は .git サブディレクトリを含むフォルダを除外します (--filter)

rsync は .git サブディレクトリを含むフォルダを除外します (--filter)

複数のフォルダをバックアップしたいです。この複数のフォルダでは、サブディレクトリを含むすべてのディレクトリを除外したいです.git。たとえば、このフォルダ階層では次のようになります。

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

すでに .git ディレクトリをすべて除外しました--exclude=.gitが、ローカル リポジトリのすべてのコンテンツがすでにリモート SCM にあるため、それらをバックアップに含めたくありません。

rsync の議論については承知しています--filter。マニュアルページを調べましたが、この問題が解決するかどうかはわかりません。ただし、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

関連情報