Настройка двусторонней синхронизации файлов с помощью unison

Для решения задачи по синхронизации данных между двумя машинами, в ситуации
когда изменения могут появиться на каждом из компьютеров, прекрасно подходит
утилита unison (http://www.cis.upenn.edu/~bcpierce/unison/). При синхронизации
между удаленными машинами в качестве транспорта может использоваться ssh. При
обнаружении конфликтов, например, когда на обоих машинах отредактирован один и
тот же файл, unison пытается разрешить конфликт автоматически, а если это не
удается предоставляет пользователю интерфейс для принятия решения.

Устанавливаем unison.

Fedora/RHEL/CentOS:

   sudo yum install unison

Debian/Ubuntu:

   sudo apt-get install unison

FreeBSD:

   $ cd /usr/ports/net/unison/ && make install

Синхронизируем две локальные директории:

   unison /test1 /test2

В процессе будет выводиться статистика и задаваться вопросы, касающаяся
синхронизации и разрешения конфликтов, направление копирования будет указано стрелкой.

Для синхронизации с удаленной директорией необходимо указать:

   unison /test1 ssh://testserver.test.ru//test1

Чтобы выполнить синхронизацию автоматически, без интерактивного взаимодействия
с пользователем необходимо использовать опцию «-batch». В случае конфликта,
выполнение будет прервано с выводом соответствующего уведомления.

Для определения сложной политики синхронизации можно создать файл конфигурации
с определением параметров.

Например, создаем файл ~/.unison/test.prf:

   # Определяем список директорий, которые будут синхронизированы
   root = /home/project
   root = /mnt/NFS/home/project
 
   # Указываем сохранять права доступа и владельца
   owner = true
   times = true
 
   # Определяем список поддиректорий, которые нужно синхронизировать, остальное игнорируем:
   path = cgi-bin
   path = htdocs
   path = conf
 
   # Определяем маски для файлов, которые не нужно синхронизировать
   ignore = Name .htaccess
   ignore = Name *~
   ignore = Name .*~
   ignore = Path conf/project.conf
   ignore = Path htdocs/rrd
   ignore = Path htdocs/mon
   ignore = Name *.o
   ignore = Name *.tmp
   ignore = Name *.log
   ignore = Name *.gz
   ignore = Name *.iso
   ignore = Name {,.}*{.old}
 
   # Копируем в резервные копии изменяемых файлов в отдельную  директорию
   backup = Name *
   backups = true
   backupdir = /home/project/backup
 
   # Определяем свою команду для отображения отличий между копиями файлов при конфликте
   #diff = diff -y -W 79 --suppress-common-lines
 
   # Сохраняем лог с результатами работы в отдельном файле
   log = true
   logfile = ./sync.log

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

   unison test