5

まず、問題の位置を少し調べてみます。ファイルの大きなツリーにビルドされるプロジェクトがあります。ビルドは数百 MB で、多数の (小さな) ファイルが含まれており、ビルド間で変更されるのはほんの一部です。これらのビルドの履歴を少し保存したいと考えており、これを効率的に行うために、ビルド間で変更されないファイルをハードリンクしたいと考えています。このために、ハードリンク マジックを実行するためのオプションを使用して、ローカル ソースからローカル ターゲットへrsync( のより強力な兄弟として) を使用します。cp--link-dest

これはインクリメンタル ビルドでは問題なく機能します。ほとんどのファイルは変更されずrsync、ハードリンク トリックが正しく実行されます。完全な再コンパイル ビルド (ここでは関係のない理由で行う必要があります) では、期待どおりに動作しないようです。再コンパイルにより、すべてのファイルが新しいタイムスタンプを取得しますが、コンテンツに関しては、ほとんどのファイルは以前のビルドと同じままです。ただし、オプションを使用rsyncしても (ファイルサイズ + タイムスタンプではなく、コンテンツに基づいて「同期」/ハードリンクします)、何もハードリンクされなくなります。--checksumrsync

この単純な(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 がオプションを無視していませんか?

4

1 に答える 1

3

問題は、「-a」フラグを使用すると、変更時刻が強制的に保持されることです (暗黙的に「-t」)。

代わりに「-rlpgo」を使用する (または「-a」の後に「--no-times」を使用する) と、変更時刻は保存対象と見なされなくなり、inode が共有されます。ファイル時間に基づく比較を行わないように、'--size-only' または '--checksum' (後者の方が明らかに安全です) のいずれかを指定する必要があります。

ドキュメントでは、更新をトリガーするために使用されるフラグと、属性の保存を制御するために使用されるフラグを明確に区別していません。

于 2012-05-28T03:56:07.560 に答える