まず、問題の位置を少し調べてみます。ファイルの大きなツリーにビルドされるプロジェクトがあります。ビルドは数百 MB で、多数の (小さな) ファイルが含まれており、ビルド間で変更されるのはほんの一部です。これらのビルドの履歴を少し保存したいと考えており、これを効率的に行うために、ビルド間で変更されないファイルをハードリンクしたいと考えています。このために、ハードリンク マジックを実行するためのオプションを使用して、ローカル ソースからローカル ターゲットへrsync
( のより強力な兄弟として) を使用します。cp
--link-dest
これはインクリメンタル ビルドでは問題なく機能します。ほとんどのファイルは変更されずrsync
、ハードリンク トリックが正しく実行されます。完全な再コンパイル ビルド (ここでは関係のない理由で行う必要があります) では、期待どおりに動作しないようです。再コンパイルにより、すべてのファイルが新しいタイムスタンプを取得しますが、コンテンツに関しては、ほとんどのファイルは以前のビルドと同じままです。ただし、オプションを使用rsync
しても (ファイルサイズ + タイムスタンプではなく、コンテンツに基づいて「同期」/ハードリンクします)、何もハードリンクされなくなります。--checksum
rsync
図
この単純な(bash)スクリプトで問題を特定/説明しようとしました:
echo "--- Start clean"
rm -fr src build*
echo "--- Set up src"
mkdir src
echo hello world > src/helloworld.txt
echo "--- First copy with src as hardlink reference"
rsync -a --checksum --link-dest=$(pwd)/src src/ build1/
echo "--- Second copy with first copy as hardlink reference"
rsync -a --checksum --link-dest=$(pwd)/build1 src/ build2/
echo "--- Result (as expected)"
ls -ali src/helloworld.txt build*/helloworld.txt
echo "--- Sleep to have reasonable timestamp differences"
sleep 2
echo "--- 'Remake' src, but with same content"
rm -fr src/helloworld.txt
echo hello world > src/helloworld.txt
echo "Third copy with second copy as hardlink reference"
rsync -a --checksum --link-dest=$(pwd)/build2 src/ build3
# Using --modify-window=10 gives results as expected
# rsync -a --modify-window=10 --link-dest=$(pwd)/build2 src/ build3
echo "Final result, not as expected"
ls -ali src/helloworld.txt build*/helloworld.txt
最初の結果は予想どおりです。3 つのコピーすべてがハードリンクされています (同じ i ノード)。
30157018 -rw-r--r-- 3 stefaan staff 12 May 10 01:28 build1/helloworld.txt
30157018 -rw-r--r-- 3 stefaan staff 12 May 10 01:28 build2/helloworld.txt
30157018 -rw-r--r-- 3 stefaan staff 12 May 10 01:28 src/helloworld.txt
最終結果は期待/希望どおりではありません:
30157018 -rw-r--r-- 2 stefaan staff 12 May 10 01:28 build1/helloworld.txt
30157018 -rw-r--r-- 2 stefaan staff 12 May 10 01:28 build2/helloworld.txt
30157026 -rw-r--r-- 1 stefaan staff 12 May 10 01:28 build3/helloworld.txt
30157024 -rw-r--r-- 1 stefaan staff 12 May 10 01:28 src/helloworld.txt
3 番目のコピーは、コンテンツが同じであってもbuild3/helloworld.txt
からのコピーにハードリンクされていないため、チェックサム チェックでこれを確認する必要があります。build2
質問
ここで何が悪いのか誰にも分かりますか?私の予想は間違っていますか?--checksum
または、ローカルからローカルに同期するときにrsync がオプションを無視していませんか?