Это звучит довольно похоже на настройку, которую мы имеем в настоящее время с Bazaar, но я думаю, что ее можно воспроизвести в Mercurial и других, используя перехваты post-commit в Git или «push-after-commit» в Mercurial. Способ сделать это на базаре - сделать что-то вроде этого:
# Create a repository
bzr init-repo --no-trees path/to/server/project
# Create the main development branch
bzr init path/to/server/project/trunk
# Create the local working copy (which contains the complete history but is bound to the server copy of trunk)
bzr co path/to/server/project/trunk working-directory-name
# Alternative command that works the same:
bzr branch --bind path/to/server/project/trunk working-directory-name
cd working-directory-name
# Now create a branch for the user to work on
bzr switch -b new-branch
# Hack hack hack
# Commit (gets pushed to server as this is a checkout a.k.a bound-branch)
bzr ci -m "Done stuff"
# Go back to trunk to merge
bzr switch trunk
# Merge
bzr merge path/to/server/project/new-branch
# Commit the merge changes (gets pushed to server)
bzr ci -m "Merged new-branch"
Все ветки будут храниться в хранилище в / path / to / server / project. Любые коммиты в локальную рабочую копию будут автоматически отправлены на сервер. Если вы используете GUI, вы можете установить мой плагин remote-feature-branch , который автоматизирует процесс создания нового хранилища с ветвью ствола и проверки его локально (первые три команды выше).
Я только немного использовал Mercurial, но я полагаю, что вы могли бы сделать это, если бы у вас была ветвь на сервере, чтобы ветвить ее локально, и отредактировать файл .hgrc, включив в него:
[hooks]
commit.autopush = hg push
У всех пользователей будет локальная копия, которая содержит все ветви в этом случае, тогда как на базаре локальная копия будет иметь только историю ветви, с которой они работали. Немного разные реализации, но функционально, я думаю, почти одинаковые.