Подтвердить что ты не робот

SVN: освободить ветвь и внешние?

У нас есть два веб-сайта для одного и того же клиента (главный сайт www и другой для сайта электронной коммерции, который находится на отдельном сервере), которые используют общую часть кода (различные функции/стили/javascript и т.д.). В настоящее время мы управляем этим, предоставляя общий код в виде отдельных проектов (в тех же репозиториях) в SVN и используя svn: externals, чтобы потянуть ветвь каждого из них в два проекта веб-сайта.

Мы только что создали две ветки релиза, по одному для двух сайтов. Все становится привязанным к сундуку для каждого из сайтов, как обычно при работе, и когда "готово для жизни" мы объединяем его в ветку релиза для этого сайта. Работает с удовольствием, за исключением того, что сегодня мы модифицировали часть общего кода и заметили, что ветвь релиза сразу же ее удалила, когда мы сделали обновление в ветки релиза. Это не то, что мы хотели: (

Итак, любые идеи, как мы можем сгладить эту проблему. Мы использовали externals для СУХОГО совместного использования кода, но есть ли другой способ? Обратите внимание, что в этом вопросе (Как я могу входить в SVN и иметь ветвь моей svn: внешние папки?), они говорят, что внешние являются плохими, и мы должны использовать другой процесс сборки, но не упоминает, что это должно быть.

У нас есть CruiseControl.net, который работает с нашими сборками и очень хочет, чтобы этот орех был взломан. У кого-нибудь есть идеи относительно лучшего процесса?

Приветствия

Пит

ОБНОВЛЕНИЕ: Мы с тех пор перешли на использование Mercurial (Fogcreek Kiln) для нашего источника управления. Mercurial также имеет идею суб-репо, поэтому мы следовали этому маршруту и ​​с нашим проектом. Однако это связано с себестоимостью, разветвление становится очень трудным, так как это мечение и просто держать все в курсе. Наш последний метод состоит в том, чтобы объединить оба проекта в один репозиторий, включая все общие репозитории. Это дает нам один "мегапроект", который замедляет время клонирования (проверка в SVN), но мы делаем это так редко, что выгоды от необходимости иметь дело с субрепозициями делают его хорошо стоящим. Теперь мы используем функцию переключения/переключения, а не ветвления, что также значительно упрощает наше развитие.

4b9b3361

Ответ 1

Если я правильно понял, у вас есть что-то вроде следующей структуры:

  • project1
    • Ствол
      • библиотека (через svn:externals library svn://repo/library)
    • ветки
      • RELEASE1
        • библиотека (через svn:externals library svn://repo/library)
      • Release2
        • библиотека (через svn:externals library svn://repo/library)
  • project2
    • Ствол
      • библиотека (через svn:externals library svn://repo/library)
    • ветки
      • RELEASE1
        • библиотека (через svn:externals library svn://repo/library)
  • библиотека

Я предполагаю, что вы - настройки svn:externals on/project1/trunk to/library. Если вы затем объедините ревизию с помощью svn:externals to/project1/branches/release1 и обновите эту ветку, вы автоматически получите последнюю версию из библиотеки. По умолчанию svn: externals получит ревизию HEAD ссылки.

Вы можете определить svn:externals для ссылки на конкретную ревизию, например: svn:externals -r123 library svn://repo/library. Это означает, что внешняя ссылка всегда укажет на эту конкретную ревизию. Таким образом, вы можете безопасно использовать этот тип ссылки svn:externals в своей ветке выпуска, не опасаясь, что код общей библиотеки будет обновляться, если вы не измените вручную svn:externals

Вероятно, лучшим способом было бы использовать теги для общей библиотеки и ссылки на определенный тег. В этом случае вы получите следующую структуру репозитория:

  • project1
    • Ствол
      • библиотека (через svn:externals library svn://repo/library/tags/version3)
    • ветки
      • RELEASE1
        • (через svn:externals library svn://repo/library/tags/version1)
      • Release2
        • (через svn:externals library svn://repo/library/tags/version2)
  • project2
    • Ствол
      • (через svn:externals library svn://repo/library/tags/version2)
    • ветки
      • RELEASE1
        • (через svn:externals library svn://repo/library/tags/version1)
  • библиотека
    • теги
      • version1
      • version2
      • Version3

Ответ 2

У другой стороны есть несколько хороших советов, но на самом деле он использует svn: externals как систему управления зависимостью бедных. Это делает хакерский анти-шаблон несколько эффективным для дисциплинированных.

Вы абсолютно правы, что svn: externals - это не путь.

Еще одна вещь, о которой стоит подумать, если вы останетесь на этом пути - если ваши svn-теги не являются атомарными (с помощью привязки pre-commit), вам нужно указать ревизию, а также тег.

В настоящее время я страдаю от шок от того, что унаследовал некоторые вещи .NET, заставляя меня так скучать. Я даже согласился на беспорядок из ant/ivy.

Вы можете проверить https://www.nuget.org/

Ответ 3

Вы можете сделать svn update --ignore-externals, если вы не хотите, чтобы внешние файлы обновлялись.

Ответ 4

Да, использование внешних ссылок, указывающих на конкретную ревизию или тег, - это путь. Вы можете легко найти это, просто прочитав руководство svn по внешним... RFD! также, всего около одной страницы...:)

http://svnbook.red-bean.com/en/1.0/ch07s03.html

Ответ 5

Я создаю освобождающие/стабильные ветки, копируя также внешние, чтобы ветвь полностью зависела от ствола. Внешние файлы скопированы с помощью

svn copy -parent

... к их соответствующей точке монтирования. un-revisionned externals используют ревизию, на которую вы хотите включить свою ветку; Исправленные внешние использовали свою указанную ревизию при копировании. svn: свойство externals должно быть удалено в новой ветке.

Некоторые скрипты (perl для меня) могут помочь автоматизировать это. Пинг меня, если вам нужна дополнительная информация об этом.