Разве DVCS (Mercurial) не для меня?

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

Customer1
    ProjectX
        App
        Tests
    ProjectY
        App
        Tests
Customer2
    Project2
Products
    Product1
Common

Сегодня все хранится в одном репозитории.

Процесс прост.

  1. Разработчик берет на себя новый проект для клиента
  2. Создаёт новую папку для проекта
  3. Код в новом проекте
  4. Выполняет некоторые работы по обслуживанию в другом проекте
  5. Проверяет обновления для проекта обслуживания
  6. Больше работы в новом проекте
  7. Отметить в новом проекте
  8. Доставить клиенту

Нет тегов и ветвлений. Более ранние версии проверяются на основе даты.

Этот процесс хорошо работает в течение многих лет, но есть несколько проблем с текущим инструментом (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
        )
    )
    

6
задан adrianm 9 November 2010 в 08:14
поделиться