web-dev-qa-db-ja.com

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

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

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

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

私はrsyncの--filter引数を知っています。 manページを調べましたが、この問題が解決するかどうかはわかりません。しかし、rsyncは事前にすべてのファイルを含むすべてのファイルリストをアセンブルするので、私は楽観的です。

それで、rsyncでgitリポジトリであるすべてのフォルダを除外することは可能ですか? --filterのディレクトリごとのルールのようなものですか?

2
0x00F

SRC変数とDEST変数を設定します。次に例を示します。

SRC="./"
DEST="../BACKUP/"

findのようなものを使用して、すべての.gitディレクトリを見つけることができます。

find "${SRC}" -type d -name '.git'

これには${SRC}/.gitも含まれます(これは${SRC}になるため、最終的には "everything"を無視します)... -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}"/

注:これはanyの追跡されていない/変更されたファイルを取得しません。

0
Attie

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