与本地到本地的--checksum的Rsync?

Ste*_*aan 5 unix linux bash rsync

我会先尝试一下这个问题.我们有一个构建到大型文件树的项目.构建是几百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
Run Code Online (Sandbox Code Playgroud)

第一个结果如预期:所有三个副本都是硬链接(相同的inode)

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
Run Code Online (Sandbox Code Playgroud)

最终结果不符合预期/期望:

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
Run Code Online (Sandbox Code Playgroud)

即使内容相同,第三个副本build3/helloworld.txt也不会硬连接到第三个副本build2,因此校验和检查应该看到这个.

有人知道这里有什么问题吗?我的期望是错的吗?或者rsync --checksum在从本地同步到本地时忽略该选项,例如因为它知道查看inode数字比在校验和上花费时间更聪明吗?

neo*_*nal 3

问题是使用“-a”标志强制保留修改时间(隐式“-t”)。

如果你使用'-rlpgo'代替(或者在'-a'后面加上'--no-times'),修改时间将不再被考虑保存,因此inode将被共享。您仍然需要指定“--size-only”或“--checksum”(后者显然更安全),这样它就不会根据文件时间进行比较。

该文档没有明确区分哪些标志用于触发更新,哪些标志用于控制属性的保存