Я работаю в компании, где мы создаем множество небольших приложений для конкретных клиентов. У нас несколько разработчиков, но в большинстве случаев на каждый проект приходится только один разработчик.
Customer1
ProjectX
App
Tests
ProjectY
App
Tests
Customer2
Project2
Products
Product1
Common
Сегодня все хранится в одном репозитории.
Процесс прост.
Нет тегов и ветвлений. Более ранние версии проверяются на основе даты.
Этот процесс хорошо работает в течение многих лет, но есть несколько проблем с текущим инструментом (CVS)
hg ci ./**
в измененных папках, но это не разрешено при слиянии, по крайней мере, так говорится в документации Если вы фиксируете результат слияния, не указывайте имена файлов или фильтры -I / -X.
)
Обычной практикой в Mercurial является создание одного репозитория для каждого проекта.
Один репозиторий для каждого проекта подходит для нас, но это создает некоторые другие проблемы например:
Как управлять несколькими репозиториями на центральном сервере?
Если разработчик создает новый проект, ему, в конце концов, необходимо продвигать свои изменения.
Простое выполнение
hg push http: // localhost: 8000 / Customer1 / NewProject
приводит к сбою hg-webserver с уродливым дампом стека и зависанию клиента.
Насколько я понимаю, сервер разработчику необходим доступ к оболочке сервера, чтобы добавить новый репозиторий в файл конфигурации и перезапустить hgweb
Альтернативой является использование SSH или общего ресурса (есть ли преимущества использования SSH вместо общего доступа к файлам?)
cd Customer\NewProject
hg init
hg clone --noupdate --pull . //mercurialshare\Customer\Project
echo "[paths]" >.hg\hgrc
echo "default=//mercurialshare\Customer\Project" >>.hg\hgrc
hg push
Работает, но для некоторых разработчиков это немного сложно
Все разработчики должны иметь все проекты.
(Не все, но многие проекты связаны между собой поэтому они должны присутствовать, и проще всего просто иметь все)
Поскольку множество существующих проектов и новые добавляются еженедельно, нам нужен способ вытащить все проекты за один раз, а также клонировать новые.
Я подумал эти подрепо могли решить "глобальную" проблему, но следующие Строка в документации - showstopper
«Когда мы фиксируем, Mercurial пытается создать согласованный моментальный снимок состояния всего проекта и его вложенных репозиториев. Он делает это, сначала пытаясь выполнить фиксацию во всех измененных вложенных репозиториях, а затем записывая состояние всех вложенных репозиториев. "
Вернемся к проблеме одного репозитория глобальных коммитов.
(Попробовал несколько вариантов hg ci. hgsub .hgsubstate
, но .hgsubstate, похоже, обновляется только при полных фиксациях. Другие пользователи не увидят изменений проекта без явного hg pull --update
в папке проекта)
В настоящее время я думаю, что в корневом каталоге должен быть командный файл, который будет извлекать все проекты.
Есть ли другие идеи о том, как использовать Mercurial в нашей организации?
Изменить
Спасибо за ответ. В настоящее время я оцениваю, как можно использовать один репозиторий. для каждого проекта подойдет. Я помещаю командный файл на верхний уровень
FOR /F %%x IN (repolist.txt) DO (
If EXIST .\%%x\.hg (
ECHO Pull %%x
hg pull --update --repository .\%%x
) ELSE (
ECHO Clone %%x
mkdir .\%%x
hg clone --pull %1\%%x .\%%x
)
)