Как я могу остановить Rsync от сохранения меток времени?

Вопрос или проблема

Я использую Rsync для установки/удаления файлов из репозитория git. Github игнорирует временные метки файлов. Я хочу, чтобы Rsync делал то же самое. Я использую следующую bash-функцию для выполнения Rsync:

Rsync() {
   # git не хранит разрешения или времена
   rsync \
      --executability \
      --filter="merge $HOME/.rsync-filter" \
      --filter="dir-merge /.rsync-filter" \
      --filter="- README.md" \
      --hard-links \
      --human-readable \
      --ignore-times \
      --itemize-changes \
      --keep-dirlinks \
      --links \
      --mkpath \
      --omit-dir-times \
      --one-file-system \
      --open-noatime \
      --partial \
      --preallocate \
      --recursive \
      --safe-links \
      --sparse \
      --no-acls \
      --no-atimes \
      --no-crtimes \
      --no-perms \
      --no-times \
      --no-xattrs \
      "$@"
}

Rsync –dry-run SOURCE DEST говорит:

>f..T...... .nanorc

О простом файле .nanorc (без ссылки), который утверждает, что существует разница во временных метках, не объявляя никаких различий в содержимом. diff не сообщает о различиях между файлами. ls -l сообщает о различии во временах изменения.

Вывод команды ls:

-rw-rw-r-- 1 me me 468 24.03.13-07.23 home/.nanorc
-rw-r--r-- 1 me me 468 24.10.29-08.49 /home/me/.nanorc

Как я могу заставить Rsync игнорировать разницу, которую он сообщает как T в пятой позиции?

Как насчет того, чтобы добавить --no-times к этому набору параметров конфигурации? Как объясняется здесь:

--no-times позволит избежать копирования временной метки, но если файл обновляется, время изменения целевого файла будет установлено на текущее. Это означает, что временные метки теперь будут различаться, так что следующий rsync подумает, что обновление необходимо, и отправит его снова!

Пример команды для правильного использования --no-times:

rsync -i -a --no-times --checksum /source/Linux/ /destination/Linux

Ответ или решение

Чтобы запретить Rsync сохранять временные метки файлов, необходимо понять, как работают параметры командной строки Rsync и их влияние на выполнение задачи. Вы упомянули, что используете функцию для выполнения Rsync, которая уже включает множество опций, среди которых присутствует --no-times. Однако, несмотря на это, вы все равно наблюдаете разницу во временных метках файлов.

Понимание параметров Rsync

Сначала разберем, что каждая из используемых вами опций делает, и как они могут повлиять на сохранение временных меток:

  • --no-times — эта опция предписывает Rsync не копировать временные метки. Если файл на целевом хранилище будет обновлен, его временная метка будет установлена на текущее время, из-за чего в следующем запуске Rsync он будет интерпретировать это как необходимость передачи файла снова.

  • --ignore-times — этот флаг заставляет Rsync игнорировать разницу во времени и всегда выполнять копирование, что может быть полезно в некоторых сценариях, но он не влияет на само копирование временных меток.

Решение проблемы с временными метками

Вы уже добавили опцию --no-times, которая должна предотвращать сохранение временных меток. Так почему же это не работает в вашем случае?

  1. Проверка наличия конфликтующих параметров: Проверьте, нет ли в вашем вызове Rsync других опций, которые могут конфликтовать с --no-times. Например, --archive (который включает в себя -t, т.е. сохранение временных меток) может переопределить --no-times. Поэтому убедитесь, что вы исключили -t из ваших параметров.

  2. Используйте дополнительные флаги для более строгого контроля: Чтобы точно игнорировать изменения в временных метках, попробуйте добавить опцию --checksum, которая заставляет Rsync сравнивать файлы по их содержимому вместо временных меток и размера:

    rsync -a --no-times --checksum /source/ /destination/
  3. Тестирование без фильтров: Попробуйте временно убрать все фильтры, чтобы увидеть, не они ли являются источником проблемы. Иногда фильтры могут влиять на отображение изменений во временных метках.

  4. Monitor logs: Включите подробное логирование, чтобы видеть, какие именно файлы обрабатываются Rsync и какие параметры учитываются при их синхронизации. Можно использовать -vv для получения максимально подробных логов.

Пример окончательной команды

Итак, учитывая все вышеописанное, ваша команда для Rsync может выглядеть следующим образом:

rsync -av --no-times --checksum --filter="merge $HOME/.rsync-filter" --hard-links /source/ /destination/

Здесь ключевыми являются:

  • -a (переделанный таким образом, чтобы исключить -t),
  • --no-times,
  • --checksum для сравнения по содержимому.

Заключение

С использованием правильных опций и проверок вы сможете достичь желаемого результата без необходимости сохранения временных меток файлов. Регулярно пересматривайте настраиваемые параметры вашей функции Rsync, чтобы убедиться в их актуальности для ваших задач.

Оцените материал
Добавить комментарий

Капча загружается...