Лучшие практики для одного крупного проекта SVN

Я унаследовал один проект в svn: 30Gb в более чем 300 000 файлах. Есть много двоичных файлов, в основном в папке с изображениями. Операции, такие как обновление всего проекта, могут быть значительно медленными.

Команда разработала процесс только для запуска обновления/переключения в конкретных папках, на которых они работают, и заканчивая проверкой в ​​сломанном коде, потому что "он работает на моем компьютере". Любая рабочая копия одного человека может включать устаревший код, код переключения и код, забытый никогда. Кроме того, имеет место минимальное разветвление.

Мое личное решение - небольшая bash checkout/build script в 5 утра каждое утро, однако не у всех есть мужество командной строки, чтобы даже скопировать мое решение, и скорее бы это было бы комфортом черепахи svn и сломанным процессом.

Кто-нибудь пытался настроить такой большой репозиторий и может дать совет? Есть ли какая-нибудь лучшая практика, которую я могу реализовать для работы с большими репозиториями, которые я могу облегчить?

P.S. внешние эффекты не кажутся хорошей идеей, и Оптимизация SVN для сохранения больших репозиториев не применяется здесь, потому что я имею дело с одним проектом

P.P.S. В настоящее время рассматривается также: http://www.ibm.com/developerworks/java/library/j-svnbins.html

Ответ 1

Во-первых, обновите до SVN 1.6 как на клиенте, так и на сервере. В примечании последней версии упоминается ускорение для больших файлов (r36389).

Во-вторых, это может быть не слишком уместно для вас, если вы должны иметь весь проект в своей рабочей копии, но используйте разреженные каталоги. Мы делаем это для нашего большого репо, первое, что делает клиент, - это проверить только каталог верхнего уровня, затем получить больше данных, использовать браузер репо, чтобы перейти в нужный каталог и "обновить эту ревизию" на нем. Он отлично работает на TortoiseSVN. 1.6 также имеет параметр "уменьшить глубину" для удаления каталогов, над которыми вам больше не нужно работать.

Если это не для вас, вы все равно можете обновить части рабочей копии. Обновление, как правило, медленнее, чем больше файлов, которые у вас есть (в Windows, которая, по-видимому, особенно бедна с помощью стратегии блокировки, используемой для обновления. Берт Хейджбен заметил это и предложил исправление - TBA с выпуском 1.7, но вы можете перестроить свой текущий код с помощью его быстрого исправления.

Альтернативой может быть изменение вашей файловой системы, если вы можете переформатировать, вы можете попробовать ext2 IFS драйвер, но я уверен, что вы будьте осторожны!

Последняя опция - выключите свой антивирус для каталогов .svn, а также для репозитория на сервере. Если вы используете Apache на сервере, убедитесь, что у вас в течение короткого времени хранятся сообщения (чтобы предотвратить повторную аутентификацию). Также отключите индексирование в своих каталогах рабочей копии и теневой копии. (последнее не очень помогает, но вы можете увидеть лучшее улучшение, которое я сделал, отключив AV на сервере, увеличил мой SVN-ответ 10x, хотя).

Ответ 2

У нас есть два репозитория: один для нашего кода (часто меняется), а другой для наших двоичных данных (очень большой, редко меняется). Это боль иногда, но стоит лучше работать при работе с кодом.

У нас также есть Ruby script, который мы называем "ежедневным обновлением", зарегистрированным в нашем репозитории, который мы запускаем на всех наших компьютерах разработки через запланированную задачу Windows рано утром. Он обновляет оба вывода до последней версии, затем строит все локально, поэтому мы готовы идти, как только мы прибудем утром.

Есть некоторые икоты, которые мы еще не сгладили - например, когда наши автоматические тесты запускаются, в настоящее время существует задержка между проверкой кода и проверкой данных, поэтому, когда мы фиксируем изменения для обоих репозиториев сервер CI иногда получает старый код и новые данные, что приводит к сбоям тестирования.

Когда мы фиксируем изменения в репозитории данных, мы обычно просто сообщаем всем, кого им нужно обновлять (все мы сидим в одной комнате). В противном случае мы обычно не обновляем данные вручную; мы просто позволяем ежедневному обновлению script сохранить его свежим.

Ответ 3

Чтобы справиться с громоздким размером, я бы рассмотрел возможность разделения двоичных данных на другую ветку (или даже полное удаление ее для хранения в другом месте), отдельно от кода. Это должно, по крайней мере, ускорить процесс, особенно если данные не часто меняются.

Я понимаю необходимость того, чтобы люди имели центральное место для своих инструментов, данных и библиотек, но это просто не работает с одним дампом.

Ответ 4

Я был менеджером SCM в аналогичной ситуации. У нас был проект с более чем 200K файлами (в основном кодом), в котором были одни и те же проблемы. Наше решение состояло в том, чтобы разделить хранилище на две версии. Одна версия является версией разработки, а другая - производственной версией. Мы сеяли версию разработки последней и самой известной рабочей копией всего кода. Разработчики начали с этого и вносили изменения, проверяли/удаляли и т.д. После того, как они почувствовали, что ситуация стабильна, администратор (в нашем случае менеджер по сборке) объединил код и выполнил сборку тестов, чтобы убедиться, что все работает правильно. Если все прошло, это было хорошо. Если бы администратор сборки не выследил разработчика и не подверг их строгому наказанию. У нас были некоторые из тех же проблем в начале, где "Это работало на моем компьютере" и т.д., Но вскоре они были разработаны благодаря избиениям и порке.....

В определенных точках код разработки (ВСЕ РАБОЧИЙ КОД!!!!) был объединен обратно в производственный цикл и выпущен клиенту.

Ответ 5

Я буду держать его в курсе:

  • Обновите до последней версии (1.6.x). 1.5.x также имел оптимизацию скорости.
  • Убедитесь, что все используют ту же версию TortoiseSVN, которая построена против точной версии сервера. У нас было много проблем с ребятами, которые обновлялись по прихоти, а затем возникали странные проблемы.
  • Внешние службы работают между серверами, репозиториями и папками на одном и том же репо. Таким образом, вы можете полностью переместить двоичные файлы на другой сервер репо/сервер и просто связать их с внешними.
  • Реструктурируйте папки, чтобы вы могли разрезать проект и все еще иметь возможность работать продуктивно. В основном все проверяют папку tops + children, а затем выборочно "обновляют до ревизии" папки, необходимые для полной проверки.
  • Создайте скрипты, которые экспортируют, строят, затем фиксируют (или запрашивают фиксацию). У меня есть такие сценарии для моего использования. Перед выполнением я запускаю script, и он экспортирует мой wc, а затем строит. ПРИМЕЧАНИЕ. Это скопирует полный wc! Поэтому это полезно при разреженных проверках, где размер данных невелик (er).
  • Рассмотрите возможность переноса двоичных файлов с репо (я не рекомендую это делать, но это может быть самым надежным решением для повышения производительности).
  • Помните, что при экспорте не создается wc, что означает, что вы сохраняете 50% дискового пространства по сравнению с проверками. Поэтому, если вы реструктурируете так, чтобы двоичные файлы и редко обновляемые элементы могли быть экспортированы вместо проверки, это побудило бы больше людей "получить всю вещь" и не пытаться скрыть некоторые из них.

Ответ 6

Можно ли разбить проект на более мелкие проекты, которые можно подключить через какую-то плагин-систему?