La opción --link-dest de rsync no se vincula debido al tiempo del archivo

La opción --link-dest de rsync no se vincula debido al tiempo del archivo

Considere este caso de prueba:

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

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

Como era de esperar, rsync crea c/testun vínculo físico de b/test(tenga en cuenta el recuento de 2):

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

Ahora mira esto:

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

El vínculo físico no se crea:

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

Elpáginas de manualdice (el énfasis es mío):

Los archivos deben ser idénticos en todosPreservadoatributos (por ejemplo, permisos, posiblemente propiedad) para que los archivos se vinculen entre sí.

Sin embargo, creo que por defecto el tiempo del archivo no esPreservadoy, por tanto, no debería suponer ninguna diferencia en este caso.

¿Lo que está sucediendo? ¿Es esto un error? ¿Qué puedo hacer?

Mi objetivo es ahorrar espacio en un servidor de integración continua que aloja muchas ramas de un repositorio vinculando todos los archivos idénticos. Entonces mi comando real es:
rsync -r --link-dest=/ci/master /ci-runner/build/ /ci/branch-123.
Esto significa que no me importan los tiempos, así que pensé en touchenviarlos todos al tiempo actual antes del rsyncpero sería una solución algo burda y además el toque no parece funcionar de forma recursiva.

Respuesta1

Estás viendo los resultados del algoritmo de "verificación rápida" de rsync que decide transferir archivos según su tamaño y su marca de tiempo. Como se detalla en man rsync:

Rsync encuentra archivos que deben transferirse mediante un algoritmo de "verificación rápida" (de forma predeterminada) que busca archivos que han cambiado de tamaño o en la hora de la última modificación. Cualquier cambio en los demás atributos conservados (según lo solicitado por las opciones) se realiza directamente en el archivo de destino cuando la verificación rápida indica que no es necesario actualizar los datos del archivo.

Tienes opciones:

  • Si desea que se ignore la marca de tiempo y se transfieran archivos basándose solo en el tamaño modificado, puede usar la --size-onlyopción.

    Tenga en cuenta que esto significa que rsyncno se transferirá un archivo modificado si el cambio simplemente deja el archivo con el mismo tamaño.

  • Si, en cambio, desea rsynccomprobar si el contenido de los archivos es realmente idéntico, utilice --checksum. Esto puede provocar una desaceleración sustancial.

El algoritmo de "verificación rápida" es el predeterminado porque generalmente es un buen equilibrio entre velocidad y precisión.

información relacionada