.gitignore設定のため、gitが無視するすべてのファイルを無視しながら、ローカルディレクトリを可能なリモートディレクトリと同期させるためにrsyncを頻繁に使用する必要があります。
これを行うには、現在のgitレプリケーションに関連するすべてのファイルをリストし、rsyncにパイプします。
cd $source
{ git ls-files -coz --directory --exclude-standard
printf '.git\0'
} | rsync --info=progress2 -ar0 --files-from=- ./ "$destination"
構文解析を git 自体に任せ、ファイルのリストを rsync にパイピングすると、私が依存するいくつかの利点があります。
- ファイルを無視するパターンは非常に複雑になる可能性があり、
!inverse-pattern-to-include
rsyncがこの構文で理解できない否定()を含めることができます。 .gitignore
また、サブディレクトリにあるファイルも考慮してください。 Rsyncのmerge-dir
フィルタは、インクルードと除外の順序がrsyncにとって重要であるため、これがリファクタリングされるのを正確に許可しません。.git/info/exclude
グローバル git 設定ファイルも考慮されます。- gitリポジトリを初期化せずに動作します。 gitを使用してgitリポジトリを指すだけです
--git-dir
。 - リポジトリは非常に大きくなる可能性があるため、すべての関連ファイルをrsync
--filter
--exclude
または--include
modeに指定すると、コマンドラインの制限が壊れたり、rsyncの速度が著しく遅くなる可能性があります。これはを使用して--files-from
防ぐことができます。
これで、欠落または除外されたすべてのファイルを--del
削除するためにrsyncフラグをサポートするように、このコードスニペットを改善する必要があります。残念ながら、それはうまく再生されません。両端のファイルリストを再比較せずに可能ですか?$destination
$source
--files-from