A opção --link-dest do rsync não liga por causa do tempo de arquivo

3

Considere este caso de teste:

mkdir a
echo 'blah' > a/test
mkdir b
echo 'blah' > b/test

rsync -r --link-dest=/tmp/b /tmp/a/ /tmp/c

Como esperado, o rsync cria c/test um link físico de b/test (observe a referência de 2 ):

# ls -l c/test
-rw-r--r-- 2 root root 16 Jan  6 19:43 test

Agora veja isto:

rm -r c # start over
touch b/test
rsync -r --link-dest=/tmp/b /tmp/a/ /tmp/c

O link físico não é criado:

# ls -l c/test
-rw-r--r-- 1 root root 16 Jan  6 19:50 test

Os manpages dizem (ênfase minha):

The files must be identical in all preserved attributes (e.g. permissions, possibly ownership) in order for the files to be linked together.

No entanto, acho que, por padrão, o filetime não é preservado e, portanto, não deve fazer diferença aqui.

O que está acontecendo? Isso é um inseto? O que posso fazer?

Meu objetivo é economizar espaço em um servidor de integração contínua que hospede muitos ramos de um repositório, vinculando todos os arquivos idênticos. Então meu comando atual é:
rsync -r --link-dest=/ci/master /ci-runner/build/ /ci/branch-123 .
Isso significa que eu não me importo com os tempos, então eu pensei sobre touch -los todos para o tempo atual antes do rsync , mas seria uma solução de alguma forma bruta e também toque não parece funcionar recursivamente.

    
por AndreKR 07.01.2015 / 02:12

1 resposta

2

Você está vendo os resultados do algoritmo de "verificação rápida" do rsync, que decide transferir arquivos com base em seu tamanho e em seu registro de data e hora. Conforme detalhado em man rsync :

Rsync finds files that need to be transferred using a "quick check" algorithm (by default) that looks for files that have changed in size or in last-modified time. Any changes in the other preserved attributes (as requested by options) are made on the destination file directly when the quick check indicates that the file’s data does not need to be updated.

Você tem escolhas:

  • Se você quiser que o timestamp seja ignorado e transfira arquivos com base apenas no tamanho alterado, use a opção --size-only .

    Observe que isso significa que rsync não transferirá um arquivo alterado se a alteração resultar em deixar o arquivo com o mesmo tamanho.

  • Se você quiser que rsync verifique se o conteúdo dos arquivos é realmente idêntico, use --checksum . Isto pode causar um abrandamento substancial.

O algoritmo de "verificação rápida" é o padrão porque geralmente é um bom compromisso entre velocidade e precisão.

    
por 07.01.2015 / 02:52