DVCS (Mercurial) не для меня? - PullRequest
       33

DVCS (Mercurial) не для меня?

6 голосов
/ 07 ноября 2010

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

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

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

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

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

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

Этот процесс хорошо работал в течение многих лет, но есть несколько болевых точек с текущим инструментом (CVS)

  • Медленное. Оформление заказа занимает минуты, даже если ничего не изменилось. История хранится на сервере, поэтому diffs занимает слишком много времени
  • Добавление новых проектов. Если вы работали с CVS, вы знаете, что это похоже на: добавить папку, добавить файлы в папку, добавить следующую папку ...
  • Нет способа отменить очевидные ошибки (проверка в двоичных файлах и т. Д.)
  • Нет поддержки переименования, что делает необходимый рефакторинг еще более болезненным.

Я какое-то время пользовался Mercurial в частном порядке и хотел бы распространить его на всех разработчиков.

Возможно, я все понял неправильно, но есть несколько вещей, которые я не понимаю, как реализовать в нашей организации.

CVS-коммиты - это только текущая папка, но в Mercurial они охватывают весь репозиторий. В нашем случае это означает, что выполнение работ по техническому обслуживанию в одной папке также приведет к тому, что еще незаконченные вещи будут сохранены в другой папке. (Я предполагаю, что мы можем сделать hg ci ./** в измененных папках, но это не допускается при слиянии, по крайней мере, так сказано в документации If you are committing the result of a merge, do not provide any filenames or -I/-X filters.)

Обычной практикой в ​​Mercurial является наличие одного хранилища на проект.

Один репозиторий на проект - это нормально для нас, но это создает некоторые другие проблемы, такие как:

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

hg push <a href="http://localhost:8000/Customer1/NewProject" rel="nofollow">http://localhost:8000/Customer1/NewProject</a>

аварийно завершает работу hg-веб-сервера с отвратительным дампом стека и приводит к зависанию клиента.

Насколько я понимаю, разработчику необходим доступ к оболочке сервера, чтобы добавить новый репозиторий в файл конфигурации и перезапустить 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

Работает, но немного сложно для некоторых разработчиков

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

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

Я думал, что subrepos может решить "глобальную" тягу, но следующее строка в документации это showtopper

"Когда мы фиксируем, Mercurial попытается создать непротиворечивый снимок состояния всего проекта и его подпунктов. Он делает это, сначала пытаясь выполнить фиксацию во всех измененных подпунктах, а затем записывая состояние всех подпунктов. "

Возвращаемся к проблеме единого хранилища глобальных коммитов.

(пробовал несколько вариантов hg ci .hgsub .hgsubstate <subrepo>, но .hgsubstate, похоже, обновляется только при полной фиксации. Другие пользователи не увидят изменения проекта без явного hg pull --update в папке проекта)

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

Есть еще какие-нибудь идеи о том, как использовать ртуть в нашей организации?

Редактировать

Спасибо за ответ. В настоящее время я оцениваю, как один репозиторий на проект будет работать для нас. Я поставил командный файл на верхнем уровне

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
    )
)

1 Ответ

8 голосов
/ 08 ноября 2010

Вы имеете право утверждать, что Mercurial рассчитан на один проект на репо. Также намного приятнее, когда вы так работаете, потому что история разных проектов хранится отдельно.

Попытка иметь несколько проектов в репозитории DVCS просто причиняет боль.

Лично я предпочитаю обслуживать проекты через SSH, а не HTTP. Одной из причин является способность ...

# hg init blah
# hg clone blah ssh://server/blah

Если вы работаете через HTTP, это не работает (как вы узнали). Я удивлен, что это вызывает тяжелую аварию, хотя: - /

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

Хотя на самом деле не то, что вы ищете.

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

В противном случае идея сценария, вероятно, самая простая.

...