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

Subversion - Объединение репозиториев

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

Наличие одного репозитория для каждого проекта в порядке. Если project1 нуждается в коде из проекта2, добавьте свойство "svn: externals" в туту проекта1, которая приносит проект2 в разумное место в каталоге project1. Если project2 нуждается в коде project3, он тоже может иметь внешнее свойство и подводить код под ним.

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

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

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

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

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

Таким образом, добавляя дополнительный репозиторий, вы получаете все преимущества проверки и построения за один шаг и, по крайней мере, имеете возможность управлять ситуациями, когда изменения, необходимые для проекта project1 break3 из-за кода, совместно используемого project2, и вы вдруг нужно получить аварийное исправление для проекта3.

Ответ 2

Недавно мне пришлось сделать что-то подобное, и я сделал это по существу:

* svnadmin create X:\Repositories\RepositoryC
* svn mkdir http://localhost:8080/svn/RepositoryC/branches --message "Added the branches folder."
* svn mkdir http://localhost:8080/svn/RepositoryC/tags --message "Added the tags folder."
* svn mkdir http://localhost:8080/svn/RepositoryC/trunk --message "Added the trunk folder."
* svn mkdir http://localhost:8080/svn/RepositoryC/trunk/A --message "Added the trunk\A folder."
* svn mkdir http://localhost:8080/svn/RepositoryC/trunk/B --message "Added the trunk\B folder."
* svn checkout http://localhost:8080/svn/RepositoryC RepositoryC
* svnadmin dump X:\Repositories\RepositoryA > RepositoryA.dmp
* svnadmin dump X:\Repositories\RepositoryB > RepositoryB.dmp
* svnadmin load X:\Repositories\RepositoryC --parent-dir trunk\A < RepositoryA.dmp
* svnadmin load X:\Repositories\RepositoryC --parent-dir trunk\B < RepositoryB.dmp
* svn checkout http://localhost:8080/svn/RepositoryC RepositoryC

Примечание. В приведенном выше коде предполагается, что на компьютере, на котором размещаются репозитории Subversion, хранилища существуют в X:\Repositories, а URL-адрес сервера Subversion - http://localhost:8080, и он находится в рабочей папке.

В этот момент вы попадете в репозиторий, в котором есть RepositoryA и RepositoryB в нем под trunk\A и trunk\B соответственно, и, самое главное, история изменений будет сохранена для RepositoryA, а также для RepositoryB. Ваша рабочая папка также содержит папку под названием "Репозиторий", в которой содержится выгрузка из репозитория.

Теперь вы можете перемещать объекты в RepositoryC для унификации структур проекта двух репозиториев RepositoryA и RepositoryB.

Ответ 3

Вы можете использовать svn-merge-repos.pl, или вы можете объединить несколько хранилищ репозитория с помощью SvnDumpTool объединить, а затем загрузить результирующий дамп с помощью svnadmin load --ignore-uuid.

Помните, что все изменения будут перенумерованы.

Проверьте раздел слияния SvnDumpTool readme.

Ответ 4

Если вы хотите, чтобы репозитории выглядели унифицированными, вы можете использовать свойство svn: externals, так что одна проверка будет вытягивать код из всех существующих репозиториев.

Ответ 5

Не делай этого. Как говорит @KeithB, ссылаясь на них, используя svn: externals должны быть в порядке.

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

Например, фонд apache поддерживает один репозиторий для всех его проектов (я не знаю, реплицируется ли он из других репозиториев или это живой). Прямо сейчас, это история весит 700k + ревизий. Я не хотел бы, чтобы этот монстр получил повреждение.