2009-06-12 5 views
1

В течение многих лет я программировал простым способом: я бы сохранил исходные файлы в каталогах, организованных языком и проектом, делал случайную ручную резервную копию, m smart, я делаю копию перед тем, как попробовать новую версию; это в значительной степени это.? Структурирование системы контроля версий (SVN) для обработки зависимостей

Недавно я решил начать использовать контроль версий. Изучив кучу статей и страниц и опробовав несколько разных, я в конце концов поселился в Subversion (хотя он удваивает размер проекта из-за BASE).


Мне теперь нужно несколько советов по нескольким аспектам, о которых я не могу найти полезную информацию. Сначала я проверяю, что у меня есть основной процесс, используя RCS правильно:

  1. импорт всех моих проектов в SVN репозитории
  2. удаляйте оригиналы
  3. выписка проекта из репозитория
  4. работы по это
  5. коммита

это все? Так что о новых проектах? Должен ли я создавать новый проект в папке, а затем импортировать его?


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

 
    X:\Data 
     \H 
     \3rdParty 
      \Graphics 
     \Controls 
      \ThisControl 
      \ThatControl 
     \Libraries 
     \Classes 
      \CFoo 
      \CBar 
     \VC 
     \Big 
      \CoolApp 
      \res 
     \Small 
      \CoolerApp 
      \res 
      \misc 
     \Test 
      \CFooTest 

... и так далее.

У меня есть несколько каталогов заголовков, которые я использую часто (например, 3rdParty \ Графика, Classes \ CFoo и т.д.) в Include пути моего IDE. Зависимости были уже проблематичными раньше, но теперь с RCS это еще хуже. Например, CoolApp может включать ThisControl и CFoo. Раньше это было бы менее идеальным, поскольку, если бы я модифицировал CFoo во время работы над CoolApp и сломал его, другие приложения, которые его используют, как . Таким образом, CoolerApp будет разбит.

Причина, по которой я делал это, вместо копирования CFoo et. и др. до Каталоги CoolApp - это из-за проблем с попыткой объединить обновления из каждой копии обратно в главную копию в папке \ H.

Я бы подумал, что с помощью официального RCS такая проблема будет устранена. Однако, что произошло, когда я импортирую проекты из \ VC \ CoolApp и т. Д. В репозитории SVN, такие компоненты, как CFoo, * Библиотеки \ ** и т. Д. Не включаются, поскольку они находятся в внешний каталог и, следовательно, не версируются, тем самым побеждая всю точку.

Я ищу советы о том, как справиться с такой ситуацией. Например, если у меня CWidget в \ H и WidgetTest (тестовый контейнер, который включает в себя CWidget) в \ VC, то как бы я структурировать вещи, такие, что оба WidgetTest и CWidget получить версию, а при этом упростить ее как можно больше для других приложений, которые используют CWidget, чтобы включить и использовать последнюю версию?


Кроме того, я только был в состоянии импортировать все мои проекты в одном репозитории, теряя Big \, Малый \, Test \ и т.д. структура. Я не могу получить Subversion, чтобы сохранить это.


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



О, и я в настоящее время Subversion настроить с моего сервера Apache, а также VisualSVN, Svnserve и CollabNet SVN сервера. Я получил каждый из них, чтобы работать, но хотел бы посоветоваться с ним, так как я уверен, что мне нужен только один.



спасибо.

ответ

2

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

Первое, что я хотел бы предложить, поскольку вы начинаете работать со следующей идеей: «Выполнение проверки ствола проекта в любом месте на жестком диске - это все, что требуется для создания раствор "

Также помните, что рабочие копии без изменений не имеют значения.Не имеет значения, где на диске вы проверяете вещи и удаляете рабочую копию, не следует начинать панику, так как вы можете просто проверить багажник снова и сразу начать работу. Я обнаружил, что в моих предыдущих местах много внимания уделяется «созданию» среды разработки и получению всего в нужном месте. Это абсурдно, и время, потраченное на это, никогда не возвращается. Сделайте это один раз, сделайте это в приличном контроле источника (например, svn, git или TFS) и будьте счастливы, что теперь вы можете работать с рабочими копиями, как вчерашняя газета.

Единственный раз, когда рабочая копия имеет какое-либо значение, есть ли какие-либо изменения, которые не были зафиксированы. Любая ценная рабочая копия уязвима. Всегда делайте изменения, если это возможно. Любая форма сбоя жесткого диска (в том числе повреждение рабочей копии), случайные удаления, изменения от чего-то, что работает на что-то, что нет, и т. Д., Может потерять значительную часть вашей работы - это ценный бит. Если ваш полупеченный код не подходит для просмотра в сундуке проекта, сделайте ветку и зафиксируйте это.

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

Это также означает, что наличие определений уровня IDE, где расположены заголовки/библиотеки, просто не будет работать. Это была ужасная идея, которую представила визуальная студия, но они также позволяют вам указывать этот материал, используя относительные папки в отдельных настройках проекта - где это должно быть. Поверьте мне, если вы используете определения местоположения уровня IDE, в какой-то момент вы собираетесь создавать свое приложение и пытаться выяснить, почему ваши изменения не появляются. Тогда вы почувствуете это чувство опускания, когда осознаете, что только что создали свои последние 3 выпуска против старой, ошибочной версии библиотеки. По крайней мере, я это сделал.

Чтобы получить эту утопическую ситуацию, вам будет намного лучше, если вы рассмотрите каждый проект библиотеки & (например, CoolApp, CFoo, ThisControl, CWidget) в виде отдельных проектов с отдельными циклами выпуска, соединительными линиями и т. Д. Двигайтесь к мысли об этих вещах независимо, разрабатывая и выпуская их отдельно.

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

Имея это в виду, я предлагаю вам структурировать хранилище что-то вроде этого:

/Projects 
/CoolApp 
    /trunk 
    /branches 
    /tags 
/Libraries 
/CFoo 
    /trunk 
    /branches 
    /tags 
/CWidget 
    /trunk 
    /branches 
    /tags 
/ThisControl 
    /trunk 
    /branches 
    /tags 
/Vendor 
/NUnit 
    /current 
    /1.6 
    /1.7 

Если хранилище не в настоящее время установки, как это, вы можете использовать svncopy структурировать ее. Вы можете использовать теги/соединительные линии/ветви на верхнем уровне и все под ним, но, на мой взгляд, это делает концептуальное разделение проектов более сложным.

Теперь проверяйте только багажник вашего основного проекта (CoolApp). Конечно - это не будет строиться так, как есть, потому что ни один из зависимых проектов не существует. Следующим шагом является добавление других проектов, таких как externals. В папке верхнего уровня вашей рабочей копии с помощью правого щелчка правой кнопкой мыши и перейдите в svn-> свойства. Добавьте новое свойство с именем «svn: externals».Определение свойств в формате

/repository_location[@revision] working_copy_folder 

Так coolapp, вы можете добавить следующую SVN: определение Externals:

/Libraries/CFoo/trunk  CFoo 
/Libraries/CWidget/trunk  CWidget 
/Libraries/ThisControl/trunk ThisControl 

Когда это будет сделано, фиксировать изменения, а затем сделать «Обновить» и ваши внешние также будут сбиты.

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

Как только вы встаете и работаете таким образом, обратите внимание, что в целом очень плохая идея иметь внешние ссылки, указывающие на багажник. Это связано с тем, что, когда соединительная линия библиотеки изменяется из-за другого проекта, когда вы делаете новую проверку своего решения (или обновления), внезапно ваше идеальное решение не будет создано, даже если вы не думаете, что вы что-то изменили в нем. Начните создавать теги для своих библиотек и вместо этого укажите на них свои внешние. Это когда вы начинаете думать о своих библиотеках как о самостоятельных проектах.

Это ситуация для другого принципа: «Любые изменения в проект должны иметь соответствующий пересмотр в багажнике основного проекта» Изменения местоположения Externals, чтобы указать на новую версию библиотеки является прекрасным примером того, чтобы быть могу сказать: «Эй, теперь я использую версию 2 здесь. Проблема в предыдущем абзаце заключалась в том, что код изменился «снизу» вас.

Чтобы изменить библиотеку, в идеале вы должны проверить рабочую копию соединительной линии этой библиотеки, изменить ее и пометить ее новым номером версии. Затем в основном проекте измените внешний элемент на точку на новый тег и Update.

Вы можете сократить этот процесс, «переключив» местоположение вашей библиотеки с тега на багажник. Таким образом, когда вы совершаете фиксацию, вы передадите изменения библиотеки в магистраль. Однако, работая таким образом, вам нужно будет помнить, что внешний объект все еще указывает на тег - вам все равно нужно пометить свою библиотеку и изменить внешний проект, иначе новая проверка не будет создана.

Если вы полагаетесь на любые сторонние инструменты, такие как nAnt или nUnit, добавьте их в репозиторий в качестве ветвей поставщиков и обратитесь к ним через внешние ресурсы. VS позволяет вам ссылаться на dll, просматривая для них, что более гибко, чем от GAC. Возможно, это не похоже на проблему для одного разработчика, но если вы попытаетесь обновить nUnit по одному проекту за раз, вы увидите, насколько лучше он сможет проверить багаж вашего проекта и знать, что вы У вас есть правильная версия nUnit вместе с ней (вместо того, чтобы удалить nUnit и переустановить нужную версию).

Обратите внимание, что нет необходимости иметь каждый проект в вашем решении как отдельный внешний. Это только те вещи, которые могут или должны быть разделены между различными проектами, которые должны быть отделены.

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

Хорошо, я остановлюсь сейчас, я не собирался использовать значок «Самый длинный ответ».

+0

Для получения дополнительной информации прочтите Eric Sink: http://www.ericsink.com/scm/source_control.html –

+0

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

 \Repository \App1 \App2 \ThisApp \SomeClass \FooLib \a_third_party_library \… 
Я пробовал несколько вещей, чтобы поместить их в категории следующим образом, но я не могу заставить его работать.
 \Repository \3rdParty \a_third_party_library \BigProjects \App1 \SmallProjects \App2 \ThisApp \Classes \SomeClass \Libraries \FooLib 
??? – Synetech

+0

Doh! Форматирование, похоже, не работает для комментариев. – Synetech

2

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

http://svnbook.red-bean.com/

Эта страница дает хорошие ссылки на дальнейшее чтение:

http://svnbook.red-bean.com/en/1.5/svn.tour.importing.html#svn.tour.importing.layout

Одна очень хорошая вещь о SVN , что неверно для CVS, заключается в том, что перемещение каталогов довольно тривиально. Поэтому не чувствуйте давления, чтобы придумать «окончательное» право организации на летучую мышь. Делайте что-то, что работает, играйте со структурой, пока вам не понравится больше.

Еще одна вещь, о которой стоит упомянуть, SVN использует метод копирования на запись для данных. Поэтому не стесняйтесь делать копии «svn cp» целых каталогов всякий раз, когда вам нужно.

+0

Спасибо, однако я уже видел книгу уже. Проблема в том, что книга не объясняет, как обрабатывать зависимости, то есть приложения, включая компоненты из каталога \ H \ * (ы). – Synetech

+0

Вы можете вытащить другие части репозиториев с помощью «внешних». http://svnbook.red-bean.com/en/1.5/svn.advanced.externals.html Вы можете обнаружить, что http://claudio.cicali.name/post/2005/10/svnexternals-micro-howto/несколько легче понять, чем документы SVN 1.5. Удобство свойства svn: externals заключается в том, что после того, как он установлен в каталог с версией, каждый, кто проверяет рабочую копию с этим каталогом, также получает преимущество определения внешних. –

+0

Благодарим вас за объяснение при внешнем использовании. Я попробую, когда я выясню, как правильно настроить мой репозиторий. – Synetech

Смежные вопросы