Fork me on GitHub
10/5/2009

Односторонняя синхронизация hg-репозиториев

Эту подсказку я подсмотрел у Армина Ронахера достаточно давно, но хочется пропиарить, потому что это удобно, правильно и замечательно работает.

Итак, ситуация: у вас есть своё место для публичных mercurial-репо, тут появляется некий сервис, у которого есть возможность (помимо публикования репо) хостинга вики и баг-трекера. Возникает желание поместить свой код в этот сервис, но и отказываться от "своего места" не хочется.

Раньше я делал так: перемещал репо на этот сервис, а потом по крону забирал изменения (`hg pull -u`) с сервиса на "своё места". Помимо того, что это костыль, это еще ненужная дополнительная нагрузка на машину, на которой располагается "своё место". Она, конечно, не твоя, а хостера, но если есть более простой и правильный способ, то почему не сделать ;-) Итак, правильный способ -- это использовать [хуки](http://www.selenic.com/mercurial/wiki/Hook). Смысл в следующем: на событие "в репо приезжает набор изменений" (changegroup) вешается операция "пошли изменения удаленному репо" (push). Подробнее и в деталях (для BitBucket): Во-первых, нужно обеспечить возможность беспарольной "посылки" изменений. Для этого нужно сделать аутентификацию по ключу. У хостера при помощи `ssh-keygen` генерируется беспарольный ssh-ключ. В [BitBucket-профиле](http://bitbucket.org/account/) добавляется публичная часть ключа (обычно, это содержимое `~/.ssh/id_*.pub`). На всякий случай, стоит проверить работу BitBucket по ssh, например, склонировав какой-нибудь репо, что-нибудь мелкое, например `ssh://hg@bitbucket.org/jetxee/rss2xmpp`. Далее, нужно настроить хуки. Для нужных репо (я буду делать на примере [pytils](http://hg.pyobject.ru/pytils)) в `.hg/hgrc` указываете: [hooks] changegroup.bitbucket = hg push ssh://hg@bitbucket.org/j2a/pytils И пробуете сделать push в этот репо ;-) P.S. С недавних пор у GoogleCode тоже [появилась поддержка mercurial](http://google-code-updates.blogspot.com/2009/04/mercurial-support-for-project-hosting.html), можно и с ним попробовать синхронизацию сделать ;-)

Комментарии

Все статьи