考虑这个测试用例:
mkdir a
echo 'blah' > a/test
mkdir b
echo 'blah' > b/test
rsync -r --link-dest=/tmp/b /tmp/a/ /tmp/c
正如预期的那样,rsync 创建了c/test
一个硬链接b/test
(注意 的引用计数2
):
# ls -l c/test
-rw-r--r-- 2 root root 16 Jan 6 19:43 test
现在看这个:
rm -r c # start over
touch b/test
rsync -r --link-dest=/tmp/b /tmp/a/ /tmp/c
未创建硬链接:
# ls -l c/test
-rw-r--r-- 1 root root 16 Jan 6 19:50 test
这联机帮助页说(强调我的):
所有文件必须相同保留属性(例如权限,可能的所有权)以便将文件链接在一起。
但是,我认为默认情况下文件时间不是保留因此在这里应该没有区别。
怎么了?这是一个错误吗?我能做些什么?
我的目标是通过硬链接所有相同的文件来节省托管存储库的许多分支的持续集成服务器上的空间。所以我的实际命令是:
rsync -r --link-dest=/ci/master /ci-runner/build/ /ci/branch-123
。
这意味着我不关心时间,所以我考虑在touch
之前将它们全部添加到当前时间,rsync
但这将是一个某种程度上粗略的解决方案,而且触摸似乎不能递归工作。
答案1
您正在看到 rsync 的“快速检查”算法的结果,该算法根据文件的大小和时间戳决定传输文件。详细信息如下man rsync
:
Rsync 使用“快速检查”算法(默认情况下)查找需要传输的文件,该算法查找大小或上次修改时间已更改的文件。当快速检查表明文件的数据不需要更新时,将直接在目标文件上对其他保留的属性(根据选项的请求)进行任何更改。
你有选择:
如果您希望忽略时间戳并仅根据更改后的大小传输文件,则可以使用该
--size-only
选项。请注意,这意味着
rsync
如果更改恰好使文件大小相同,则不会传输更改的文件。如果您想
rsync
检查文件的内容是否实际上相同,请使用--checksum
.这可能会导致速度大幅减慢。
“快速检查”算法是默认算法,因为它通常是速度和准确性之间的良好折衷。