Макет репозитория Subversion для библиотек, разработанных в разных программах

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

Для аргумента предположим, что есть две программы с двумя библиотеками:

  • Program1
    • Library1
    • Library2
  • Program2
    • Library1
    • Library2

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

Я думал что-то вроде:

  • Библиотеки
    • Библиотека1 (предок)
    • Библиотека2 (предок)
  • Program1
    • Код программы 1
    • Библиотека1 (ветвь поставщика)
    • Библиотека2 (ветка поставщика)
  • ...

Тогда скажем, при разработке Program1 некоторые изменения внесены для Library2, я объединю их обратно в часть Libraries в репозитории и объединим их оттуда ко всем другим программам по желанию.

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

Я немного обеспокоен тем, что через некоторое время произойдет много слияний и немного головной боли в обслуживании, но на самом деле я не вижу гораздо лучшего решения.

И снова это кажется довольно распространенным случаем для меня, поэтому я подумал, что просто попрошу сообщество stackoverflow, какой лучший макет репозитория достигнет этого?

Ответы

Ответ 1

Ну, я думаю, я не согласен с тем, что внешние вопросы не могут быть и речи. У меня была аналогичная проблема в прошлом. Я решил это, используя внешние свойства svn.

Создайте репозитории библиотеки:

svnadmin create /path/library1
svnadmin create /path/library2
...

Создание клиентских репозиториев:

svnadmin create /path/program1
svnadmin create /path/program2
...

Теперь объявите библиотеки внешними в репозиториях программы:

cd /path/program1
svn propset svn:externals "library1 svnpath://wherever/library1/trunk/" .
svn propset svn:externals "library2 svnpath://wherever2/library2/trunk/" .

Теперь вы можете вносить изменения в программы 1 и 2, а фиксация в корне этих проектов не влияет на библиотеки... но если вам нужно внести изменения в библиотеки, вы можете. Тогда тогда и только тогда, когда у вас есть права на запись в библиотечные репозитории, вы также можете зафиксировать эти изменения, но только из подкаталога библиотеки.

т.е. это не делает фиксацию для библиотек...

... make a change in /path/program1/library1 ... 
cd /path/program1
svn commit -m "some change"

Это совершает изменение, внесенное в библиотеку выше:

cd /path/program1/library1
svn commit -m "change to library code"

Ответ 2

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