
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 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 touch
transferi-los todos para o horário atual antes do, rsync
mas 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-only
opção.Observe que isso significa que
rsync
não será transferido um arquivo alterado se a alteração deixar o arquivo com o mesmo tamanho.Se você quiser
rsync
verificar 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.