Как экспортировать наборы изменений из репозитория hg в репозиторий SVN - PullRequest
3 голосов
/ 30 ноября 2009

Я знаю, что есть расширение hgsubversion для Mercurial. Но до того, как я понял, как это работает, у меня есть два отдельных репозитория, один - репозиторий SVN, а другой - репозиторий Hg. Я сделал большинство своих недавних изменений в репозитории Hg, и мне нужно «протолкнуть» их в репозиторий svn.

Самый простой способ сделать это - получить одну ревизию от svn, которая синхронизирована с одной ревизией от hg.

Оттуда я обновляюсь до следующей ревизии (от Hg), затем фиксирую ее (для svn). Повторять эти шаги для многих наборов изменений довольно неудобно. Есть ли более удобные способы сделать это?

И, если возможно, решение, которое работает в ОС Windows.

С уважением,

Afriza

Ответы [ 5 ]

2 голосов
/ 30 ноября 2009

Нет, нет.

Возможно, вы уже видели эту ссылку. В настоящее время взаимодействие с репозиториями SVN официально пока не поддерживается. Я бы не стал писать скрипт для автоматизации этого. Это может привести к неожиданным результатам, испортить репозитории (однако взгляните на следующий рабочий процесс)

https://www.mercurial -scm.org / вики / WorkingWithSubversion .

В настоящее время я делаю что-то похожее на то, что вы делаете.

  1. извлечение из репозиториев SVN сохраните его в $ HOME / svnhgrepos / project1
  2. goto $ HOME / svnhgrepos / project1, hg init, hg commit
  3. изменить $ HOME / svnhgrepos / project1 / .hg / hgrc для автоматического обновления при нажатии
  4. клонировать $ HOME / svnhgrepos / project1 в $ HOME / code / project1-clone.
  5. goto $ HOME / code / project1-clone, hg qinit (ртутные очереди)
  6. делать всю разработку, фиксировать ее (только один набор изменений для каждой функции / исправления) и отправьте его в $ HOME / svnhgrepos / project1
  7. Перейдите в $ HOME / svnhgrepos / project1 и выполните команду 'svn ci'
  8. Я не сделал этот шаг в моей настройке. Теперь вы можете написать hg hook, чтобы автоматически выполнять 'hg update' и 'svn commit'
    
       e.g (i have not tested this)
       in $HOME/svnhgrepos/project1/.hg/hgrc   
       [hooks]
       changegroup.hg-update = hg update >&2
       changegroup.svn-commit = svn commit -m "hg log --template '{desc}' -r ."
       
    
2 голосов
/ 30 ноября 2009

Если вы говорите о линейной серии наборов изменений (без слияний), вы можете использовать оболочку for loop

for therev in $(seq $(hg id -n -r .) $(hg id -n -r tip)) ; do
  hg update $therev
  svn commit -m "$(hg log --template '{desc}' -r .)"
done

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

1 голос
/ 10 апреля 2010

Я взял ответ Ry4an и добавил обработку добавления / удаления. Вот оно:

for therev in $(seq $(hg id -n -r .) $(hg id -n -r tip)) ; do
  hg update -C $therev
  svn st | perl -lne 'if (/^([?!])\s*(\S*)/) { my $command = ($1 eq "?") ? "add" : "rm"; my $fname=$2; $fname =~ s[\\][\/]g; system(qq(svn $command $fname));}'
  svn commit -m "$(hg log --template '{desc}' -r .)"
done

Я обнаружил, что -C был необходим, когда были задействованы ветви. Это становится довольно уродливым, так как файлы удаляются и повторно добавляются при переключении между ветвями. Также, как правило, информация о переименованиях теряется, а также, конечно же, даты и личность исходного коммиттера.

0 голосов
/ 03 апреля 2019

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

Я работаю в ОС Windows 7 и использую и Mercurial (TortoiseHg), и Subversion (TortoiseSVN) для контроля версий. Зачем? Что ж, мы обнаружили, что в нашей очень небольшой команде, состоящей из 8 человек, Mercurial очень удобно использовать в качестве «личной» сети безопасности, но это очень сбивает с толку некоторых наших людей (например, инженеров FPGA, работающих в Verilog). Мысли «толкать» и «тянуть» с требованием объединить все изменения других людей с вашими не приветствовались с распростертыми объятиями. Это казалось обременительным, и в одном случае инженер потерял всю свою работу из-за неправильного понимания некоторых нюансов того, как Mercurial делает эти вещи. К счастью, была еще одна копия (она умный инженер!), Поэтому не все было потеряно, но это продемонстрировало, как операции Mercurial могут быть запутанными и трудно предсказуемыми, по крайней мере, для некоторых людей.

Сила Mercurial (IMO) - это простота, с которой вы можете переключаться между различными ветками разработки, а с помощью инструмента TortoiseHg визуализируйте дерево версий и выберите, над чем вы хотите работать. Вы можете очень легко (и быстро!) Сохранить свою работу, захватить другую ветку или начать новую, чтобы провести некоторые эксперименты или использовать альтернативный подход. Как удобная личная сеть безопасности и инструмент для смены филиалов, он великолепен. Я использую его все время, пока разрабатываю и тестирую свой код.

Subversion, с другой стороны, делает очень простым в использовании "командный" сервер. Людям легко понять, как это работает. Маркировка и ветвление не так интуитивны, но мы делаем это не очень часто. Обновления, слияния и проверки кажутся более интуитивными и более простыми в управлении.

Оказывается, вы можете управлять одной рабочей копией, используя ОБА Mercurial и Subversion - одновременно! Вы можете извлечь из SVN, затем использовать Mercurial, чтобы «создать репозиторий здесь», или сделать это наоборот. Вы должны отредактировать настройки игнорирования SVN, чтобы игнорировать все файлы .hgxxxx в папке рабочей копии, и чтобы Mercurial игнорировал каталог .svn. После того, как вы это сделали, инструменты командной строки или расширения оболочки для любой системы продолжают работать так же, как и они, и вы теперь управляете своим кодом в двух разных репозиториях!

Сначала я был настроен скептически, но я действительно хотел удобство повседневной работы Mercurial с совместимостью Subversion с центральным сервером, которую наша команда выбрала для общего хранилища кода. Этот способ работы дает вам лучшее из обоих миров без недостатков, которые я заметил до сих пор.

0 голосов
/ 30 ноября 2009

Похоже, вы могли бы использовать hg convert, чтобы сделать то, что вы хотите, задним числом. Включите ConvertExtension, а затем просто выполните hg convert -d svn file/path/to/mercurial/repo svn://repo/path/, хотя я еще не пробовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...