A opção --link-dest do rsync não vincula devido ao tempo do arquivo

A opção --link-dest do rsync não vincula devido ao tempo do arquivo

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/testum hardlink de b/test(observe a refcount of 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 hardlink não é criado:

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

Opáginas de manualdiz (ênfase minha):

Os arquivos devem ser idênticos em todospreservadoatributos (por exemplo, permissões, possivelmente propriedade) para que os arquivos sejam vinculados.

No entanto, acho que por padrão o tempo do arquivo não épreservadoe, 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 hospeda muitas ramificações de um repositório, vinculando todos os arquivos idênticos. Então meu comando real é:
rsync -r --link-dest=/ci/master /ci-runner/build/ /ci/branch-123.
Isso significa que não me importo com os horários, então pensei em touchtransferi-los todos para o horário atual antes do, rsyncmas seria uma solução um tanto grosseira e também o toque não parece funcionar recursivamente.

Responder1

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

O Rsync encontra arquivos que precisam ser transferidos usando um algoritmo de “verificação rápida” (por padrão) que procura arquivos que mudaram de tamanho ou na hora da última modificação. Quaisquer alterações nos outros atributos preservados (conforme solicitado pelas opções) são feitas diretamente no arquivo de destino quando a verificação rápida indica que os dados do arquivo não precisam ser atualizados.

Você tem escolhas:

  • Se quiser que o carimbo de data/hora seja ignorado e transfira arquivos com base apenas no tamanho alterado, você pode usar a --size-onlyopção.

    Observe que isso significa que rsyncnão será transferido um arquivo alterado se a alteração deixar o arquivo com o mesmo tamanho.

  • Se você quiser rsyncverificar se o conteúdo dos arquivos é realmente idêntico, use --checksum. Isto pode causar uma desaceleração substancial.

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

informação relacionada