svn tips

    Сегодня занимался устройством проекта и возился с svn — решил поделиться некоторыми советами:
    Автоматическая заливка кода на сервер из репозитория после коммита
    Версионирование файлов настроек (Settings.php/xml/yml)
    Храниение жирных и малоизменчивых сторонних библиотек в репозитории с быстрым чекаутом проекта

    • Автоматическая заливка кода на сервер из репозитория после коммита
      сайт на php и захотелось, чтоб после коммита в репозиторий код на демо-сервере автоматически обновлялся.
      Cделать это можно с использованием svn-hooks: в корне каждого репозитория есть папочка hooks, в которую можно положить чтонить исполняемое (например shall-скрипт: full/path/to/svn update path/to/web/folder) и назвать определенным образом (например post-commit.sh или post-commit.bat) — и после каждого комита этот скрипт будет выполняться и обновлять код на демке (возможны проблемы с разрешениями на доступ к файлам — читайте ссылки).
      При этом на демку будут выкладываться и служебные файлы svn. Эта проблема решается настройками apache:
      <DirectoryMatch "^/.*/\.svn/">
      Order deny,allow
      Deny from all


      или использованием svn команды export (http://svnbook.red-bean.com/en/1.0/re10.html) вместо update (http://svnbook.red-bean.com/en/1.1/re28.html).

      Тут перед вами встаёт тонкий выбор. Использовать export кажется проще. Однако при использовании update вы потом сможете залить быстрые фиксы сделанные прямо на сервере в svn репозиторий.

      links:
      arstechnica.com/articles/columns/linux/linux-20050406.ars
      subversion.tigris.org/faq.html#website-auto-update

      кстати с использованием svn-hooks можно делать очень много полезного: запускать тесты, оповещать кого-нибудь, автоматически собирать приложение и т.д.

      Как версионировать настройки (Settings.php/xml/yml)
      итак у нас есть файл с настройками он будет правится под каждую машину на которую ваше приложение будет ставиться. Поэтому каждый групповой коммит с новой машины будет переписывать этот файл в репозитории и при обновлении рабочей версии на другой машине он тоже может неприятно переписать настройки на этой машине. Как быть нам подсказывает subversion.tigris.org/faq.html#ignore-commit:
      следует скопировать файл с начальными настройками например settings.php в settings.template.php и добавить settings.php в svn:ignore. И в результате при развертывании приложения надо произвести обратную операцию копирования settings.template.php в settings.php (settings.php отсутствует в репозитории) и потом подправить его под конкретную установку. Из-за svn:ignore файл settings.php коммитеться уже не будет

      Как хранить жирные сторонние библиотеки
      В моем случае это было dojo (прекрасный js toolkit), который намного больше самого проекта (и практически не будет меняться), а попытка залить его в репозиторий и получить обратно занимает неприятно много времени. Поэтому я немного модифицировал предыдущий прием для решения этой проблемы:
      итак мы имеем глубокую папку dojo — добавляем ее в svn:ignore — и архивируем в extract_to_dojo.archiv — который и заливаем в репозиторий. При разворачивании на новом месте надо произвести обратную операцию.
      В принципе для автоматизации развёртывания новой версии можно написать небольшой скриптик, который пройдёт по всем /extract_to(.?)\.rar/ и разархивирует их в $1



    • Для тех кто вынужден работать на платформе Win полезная сборка svn + apache + gui — www.visualsvn.com
    Поделиться публикацией

    Похожие публикации

    Комментарии 17

      0
      Приятно. (:
        +3
        По поводу жирных чужих библиотек.

        Нам оказалось удобнее использовать svn:external для включения библиотек в дерево проектов.
          0
          угу спасиб посмотрю и пересмотрю
            0
            Эх, кабы SVN, еще умела "экстерналить" не только директории, но и файлы :\.
              0
              Угу, иногда не хватает
            0
            > shall-скрипт
            Скрипт все-таки shell

            Не подскажете, случаем, как получить номер последнего коммита из удаленного репозитория в виде числа? Есть svnlook -youngest PATH, но это для локальных.
              0
              svn info URL — там в инфе есть номер последней ревизии.
                0
                У меня Svnlook используется следующим образом: tar -zcf project-r`svnlook youngest REPOS_PATH`.tar.gz project. Хотелось бы научиться делать такое же и с удаленным репозиторием.
                  0
                  grep и sed вам в помощь ;)
              0
              насчет пост-коммита: svn up лучше делать во временную папку, а из нее уже rsync'ом с --exclude=.svn валить все на сервер. так избавляемся от описанных геморроев
              незнаю правдо рсинк под винду есть нет
                0
                кстати, элегантно, спасибо.
                +1
                Правильная ссылка на VisualSVN Server это http://www.visualsvn.com/server
                А http://www.visualsvn.com это ссылка на VisualSVN — интеграция Subversion в Visual Studio.
                  0
                  из 3-х предложений согласен только с первым. второе спорно, а третье - костыль
                    0
                    расскажите как это сделать элегантней
                      0
                      что именно? :)
                      если про третье, то только смириться. не так уж и часто делается svn co|export. или не хранить сторонние библиотеки в проекте в принципе
                    0
                    Первый пункт практически не юзабельный потому что чаще репозиторий находится физически на другом сервере, скорее всего в офисе, а рабочая копия на хостинге. Обычно в таких случаях приходится создавать RSA ключи для пезпарольной авторизации и запускать svn update на удаленном сервере.
                      0
                      тут есть отличный скрипт инкрементного обновления через svn export stackoverflow.com/questions/446518/using-svn-post-commit-hook-to-update-only-files-that-have-been-commited

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое