Оффлайн синхронизация папок
Всем привет! Занимаясь некоторыми проектами в одиночку, передо мной возникла проблема синхронизации папок с проектами, находящимися под контролем SVN, и соответственно самого хранилища, на домашнем и рабочем ПК.
Прежде чем пинать меня в сторону rsync и подобных программ хочу предупредить, во-первых, интернет трафик сильно ограничен, во-вторых, режимное военное предприятие, в-третьих, исходники проектов имеют коммерческую ценность (лично для меня), так что даже при возможности использовать сетевые сервисы (типа Dropbox), надо быть полным идиотом что бы хранить там результаты своего труда. А держать полную копию проектов, например на флэшке, для синхронизации не очень хочется.
Проблемным данный вопрос стал после того, как размер папки с локальным хранилищем SVN и самими проектами перевалил за 4 Гб, а кол-во файлов за 50 тысяч (на момент написания статьи). Я организовал работу таким образом: и на работе и дома у меня установлен TortoiseSVN, структура каталогов и названий дисков полностью идентична, для того чтобы можно было спокойно работать и дома с тем что у меня творится на работе. Первое время мне достаточно было просто архивировать папку с SVN хранилищем и папку с проектами и таскать их на флэшке, но, когда объём данных папок существенно подрос, время архивирования стало составлять от 30 минут до … сами понимаете. Задавшись данным вопросом, я пытался найти готовое решение, первая проблема, с которой я столкнулся, заключалась в том, что все решения для синхронизации подразумевали синхронизацию двух папок (rsync и подобные), мне же необходимо было следить за изменениями одной папки на одном ПК и автоматически переносить изменения на другой, с сохранением структуры вложенных папок и файлов, без копирования всего содержимого папок (как иначе «синхронизировать» я не понял). Так же необходимо было отследить удалённые объекты и произвести данные изменения на домашнем ПК.
Подробно изучив Tortoise, используемую мною для контроля версий программ, я нашёл два возможных варианта переноса изменений, первый позволял выгрузить изменённые объекты из рабочей копии проекта, но, проблема заключалась в том, что svn клиент выгружал изменённые объекты кучей без сохранения структуры вложенности (расположения) объектов, второй вариант представлял собой создание патча, и последующее применение патча на домашнем ПК, но так как у меня под котролем svn находятся не все файлы, дабы избежать разбухания svn хранилища, соответственно изменение файлов не находящихся под контролем svn отследить было нельзя, а там у меня есть и видео файлы, и картинки и прочие типы файлов. Таким образом svn клиент оказался в данном случае бессилен мне помочь. Почитав руководство svn сервера я узнал команды которые позволяют выгрузить изменения рабочей копии проекта в файл и потом загрузить в рабочую копию на домашнем ПК, но это возможно в полноценной версии сервера, я же пользуюсь Tortoise локально, а там, как я вычитал из руководства, ограниченный набор поддерживаемых команд svn. Да и ставить полноценный svn сервер для меня было как то не комильфо. Далее я стал искать решение в интернете, перепробовал кучу программ (например AllwaySync), но принцип их был однообразен – сравнение содержимого двух папок, и автоматическая синхронизация. Наконец я нашёл продукт, который выполнял именно то что мне нужно – Comodo Backup.

Программа мне очень понравилась, интерфейс на пятёрку, набор функций отличный, всё ок, бери и пользуйся, но, попытавшись использовать программу я наткнулся на новые грабли. Создал новый план бэкапа (инкрементный) в программе, включив в него в качестве источника свои папки, попробовал изменить некоторые файлы. Потом запустил программу, для того что бы выполнить бэкап и офигел, время калькуляции объектов составило порядка 30 минут, оно понятно, программа считает контрольные суммы файлов, а этот процесс трудоёмкий. Итоговое время подсчёта и выгрузки составило примерно 45 минут, это при том, что я буквально подредактировал пару файлов. Изменить принцип контроля в программе невозможно, таким образом, я вернулся к своим баранам. Программа позволяла минимизировать объём переносимых файлов, но время, затрачиваемое на всё это было примерно равно полному бэкапу папок с помощью winrar’а.
В результате всех моих мытарств, я наконец нашёл решение в интернете, программа называется SyncFolder, автор я так понимаю не очень популярен, программа в зачаточном состоянии, и дорабатывать её автор, я так понял не собирается, хотя я пытался с ним общаться на данную тему.
Попробовав программу в действии, я понял что это именно то что мне нужно, но ошибки и недоработки не позволили использовать её в полной мере, а решение мне очень понравилось (как я сам раньше не додумался?!), поэтому я решил написать аналогичную программу сам.
Полгода разработки и тестирования и программа готова, я использую её ежедневно уже более полугода.

Вот основной перечень функций:
• Отслеживание изменений в выбранном источнике (одна или несколько папок), с последующим экспортом изменённых объектов;
• Установка параметров контроля изменения файлов, как, например, размер файла, дата изменения, атрибуты, контрольная сумма;
• Возможность использования маски на основе регулярных выражений;
• Возможность использования списка исключений;
• Возможность сжатия изменённых объектов в формат zip (встроенный архиватор);
• Возможность запуска программы из командной строки.
Таким образом, работа заключается в следующем: создаём с помощью программы снимок источника, в качестве которого может выступать как одна, так и несколько папок, далее работаем над проектами, в конце дня запускаем обработку созданного ранее снимка (можно из программы, можно с созданного ярлыка запуска программы в консольном режиме, можно с созданного в программе скрипта (cmd файл)), указав папку экспорта изменённых объектов. В результате работы программы будет произведено копирование изменённых объектов (файлы/папки) в папку экспорта с соблюдением структуры папок, с учётом их вложенности, с созданием bat файла в корне, с последовательностью команд удаления объектов, которые были удалены в источнике. Далее достаточно скопировать содержимое экспортированных папок на ПК на котором расположены папки назначения, с заменой объектов, и выполнить bat файл, скопировав его так же в корень папки назначения, приведя, таким образом, папку назначения в соответствие папке источнику на другом ПК.
Как вариант, можно использовать программу в качестве инструмента для инкрементного бэкапа источника. Т.е. каждый день выгружать изменённые объекты в папку экспорта (к имени выгружаемой папки/архива добавляется текущая дата и время), делая, таким образом, бэкап изменённых объектов. Объём сохраняемых данных минимизируется, а восстановление источника упрощается, благодаря встроенной поддержке в Windows zip архивов (не потребуется стороннее программное обеспечение). Достаточно хранить полную копию источника, и набор ежедневных (недельных, нужное подчеркнуть) бэкапов.
Итак, данное решение не претендует на новизну и гениальность, возможно я чёго то не понял, что то не доглядел, поправьте меня, подскажите возможные варианты решения моей проблемы, в общем конструктивная критика приветствуется! Надеюсь кому то программа окажется полезной и поможет в ежедневном труде, буду благодарен за отзывы, как положительные так и отрицательные. Безразличных или непонимающих людей, а также, тех, кто не в теме, прошу не гадить в теме!
UPD 30.11.2011
Версия 3.0
UPD 20.12.2011
Версия 3.1
Изменения в версии:
- Исправлено копирование структуры источника в структуру снимка при сохранении изменений (структура не копировалась, а просто очищалась)
- Исправлена автопрокрутка к последней строке в окне сообщений (при добавлении строк не переходило на последнюю)
- Добавлено выделение цветом изменённых объектов в структуре (удалённые - красным цветом, новые/изменённые - зелёным)
- Добавлен выбор темы оформлений программы (в настройках программы)
Ссылка: setup3.1.rar
- ronin's блог
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- 1206 просмотров



Комментарии
25 комментария(ев)Дата: СР, 19/10/2011 - 15:29
А исходники не планируешь выложить?

Дата: СР, 19/10/2011 - 15:34
...ну что могу сказать, многие забыли истоки, а между тем есть старые добрые возможности командных файлов: при желании можно делать бэкапы только по определенной дате, например текущей, т.о. все 4 гига не придется каждый раз переписывать ....и множество других вариантов.
Аналогичную проблему синхронизации, перед уходом домой, решил написанием своего "бэкапера", отлавливающего сообщение о завершении работы Windows, прерывающего его, запускающего скрипт-батник с ожиданием завершения выполнения скрипта и дающего команду на выключение ПК со своей стороны. А уже в батнике можно "извращаться" как душе угодно. Интерфейс отсутствует, ибо для батника он и даром не нужен, а настройка единична. Т.о. флешка у меня торчит в USB порту, а после выключения ПК все нужные данные уже синхронизированы на флешке.
Дата: СР, 19/10/2011 - 15:47
не хочу позориться
понятно что вариантов много и каждый их решает по своему, мне больше по душе такой вариант... а на сервере у меня работают такие скрипты
у меня вопрос что означает выделенная фраза? какие данные будут на флэшке? в каком виде? синхронизированы с чем? заметьте, программе не нужна копия папки источника для сравнения!
Дата: СР, 19/10/2011 - 16:36
...данные, определенные скриптом, выше уже сказано.
Дата: СР, 19/10/2011 - 16:38
меня смущает слово синхронизированы
синхронизированы с чем?
Дата: СР, 19/10/2011 - 18:20
...в случае задания в скрипте - копирования файлов с текущей датой, будут скопированы файлы источника с текущей датой, т.е. те которые изменились сегодня
Приведу простой пример такого батника, для общего понимания процесса:
@echo off setlocal pushd "c:\1" for /f "tokens=*" %%i in (' dir /b *.xml ') do ( for /f "tokens=1" %%j in ( "%%~ti" ) do if "%%j"=="%date%" set "file=%%i" ) copy "%file%" "d:\2" popd...и разумеется ссылочку на статью про сам "Бэкапер", дабы не быть голословным ]]>HTML]]> | ]]>PDF (в печати)]]>.
Дата: СР, 19/10/2011 - 20:41
тоже вариант
тогда возникает вопрос - как посчитать контрольную сумму файла? или использовать какой то другой алгоритм?
UPD я тут ещё подумал, а если я несколько дней не бэкапил изменения? получается слишком много если, прийдётся либо добавлять возможность ввода входящих параметров для скрипта, либо каждый раз править батник
Дата: СР, 19/10/2011 - 22:31
Касательно контрольной суммы, думаю, что заморачиваться над этим не стоит. Простота прежде всего, а "монстры" пользователям не нравятся.
Дата: СР, 19/10/2011 - 23:30
т.е. мы возвращаемся к тому что должен быть приемник, т.е. копия, для меня держать актуальную копию на флэшке недопустимо
надеюсь вы не будете отрицать что бывают случаи когда это необходимо
Дата: ЧТ, 20/10/2011 - 00:50
Дата: ЧТ, 20/10/2011 - 02:26
именно из-за этих частностей я и задался этим вопросом, как минимизировать время на поиск изменённых объектов и объём переносимых данных
Дата: СР, 19/10/2011 - 15:47
А что Гитом не пользуетесь? Там по моему вообще синхронизация работает из коробки, ну или если скачать плагин
Дата: СР, 19/10/2011 - 16:09
ключевой момент оффлайн, не происходит сравнения с другой папкой, сравнивается источник с созданным снимком
Дата: СР, 19/10/2011 - 16:26
А, ну тогда ясно.
Дата: СР, 19/10/2011 - 20:17
а вообще было бы здорово увидеть статью как писалась это прога! штука конечно полезная, планирую использовать
Дата: СР, 19/10/2011 - 22:42
Git рулит.
Дата: СР, 19/10/2011 - 23:31
это понятно, но как система контроля версий относится к вопросу оффлайн синхронизации?
Дата: СР, 30/11/2011 - 19:40
]]>
]]>
Версия 3.0
Изменения в версии:
- Добавлено отображение структуры снимка и источника в виде дерева (изменённые/удалённые/новые объекты помечаются соответствующими значками)
- Добавлен подсчёт объёма объектов в снимке, источнике и объём копируемых/удаляемых данных
- Изменён формат снимка (обратной совместимости нет, поэтому перед началом работы необходимо пересоздать старые снимки)
- Проведена оптимизация консольного режима (исключение лишних действий)
- Проведена переработка кода программы (рефакторинг, оптимизация)
Ссылка:
]]>ruskyhost]]>
Дата: СР, 30/11/2011 - 20:50
Сделай апдейт статьи. Не все читают комментарии. И уменьши картинки, добавь тег width="60%" например 60%
Дата: СР, 30/11/2011 - 21:11
приписать блок в самой теме? на другом ресурсе где тоже выложил прогу есть спец средства для отображения обновлений, как тут не понял
Дата: СР, 30/11/2011 - 21:57
Просто отредактируй свою статью. Посмотри, наверху статьи должны быть вкладки Просмотр, Редактирование и т.д.
В своем комментарии картинку тоже уменьши. Уважай людей, которые заходят заходят на сайт с мобильных устройств и нетбуков!
Дата: СР, 30/11/2011 - 22:01
там нет кнопки изменить, только ответить
Дата: ЧТ, 01/12/2011 - 15:39
Я не знал, значит прав нет. Ладно, сам поправлю. Просто на будущее имей ввиду. Пользуйся кнопкой предпросмотра, чтобы увидеть как будет выглядеть твой комментарий.
Дата: ЧТ, 01/12/2011 - 16:40
права есть, просто кнопка изменить присутствует только в постах без ответа, если есть ответ на пост то кнопки изменить нету
Дата: Втр, 27/03/2012 - 18:40
Собственно с позиции улучшения вопросы:
- если есть возможность добавить в GUI программы возможность пароль на архив ставить (а то и шифрование из каких открытых алгоритмов). Тогда запросто можно сей архивчик скидывать в инет, и при этом не чувствовать себя "идиотом" начав "использовать сетевые сервисы (типа Dropbox)" - плюсы онлайн хранения все же есть и немалые, да и на флэшке пущай лежит пароленый - не так страшно потерять ее невзначай.
- если я перенес файл из папки в папку, в экспортную папку при сверке снимков копируется файл, а не собственно "факт перемещения", при том что и размер и прочие атрибуты собственно файлов не меняются. Не хотелось бы лишними данными место занимать, если без этого обойтись возможно.