Как я могу изменить две произвольные ревизии в Mercurial таким образом, чтобы я мог применить diff к рабочей копии SVN? - PullRequest
1 голос
/ 06 августа 2010

Система записи - это хранилище SVN, но по каким-то причинам я перенес хранилище в Mercurial. Я не хочу использовать расширение hgsubversion, потому что оно не рекомендует создавать дополнительные клоны и ветви и т. Д.

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

Итак, у меня есть:

/dev/repos/hg/project/master
/dev/repos/hg/project/master-feature-foo
...

На стороне Mercurial и на стороне SVN у меня есть:

/dev/repos/svn/project

Я хотел бы иметь возможность перезаписать мою рабочую копию SVN, / dev / repos / svn / project, содержимым моей рабочей копии, скажем, / dev / repos / hg / project / master-feature-foo.

Какие команды Mercurial и SVN способствуют этому? Я просматриваю документы для hg diff, hg export и TortoiseSVN, чтобы применить исправления для подсказок, но я пока не нашел решения.

Ответы [ 2 ]

2 голосов
/ 06 августа 2010

У вас есть несколько вариантов передачи подсказки в каталог svn:

разница в размерах и патч:

cd /svn/working/copy
hg -R /hg/working/copy -r svn.15500:tip | patch -p1`

копирование измененных файлов

#!/bin/bash
REV=$1
HG=/hg/working/copy

cd /svn/working/copy

# copy changed files, tar is used instead of cp to preserve file paths
hg -R $HG st --rev $REV:tip -man0 | xargs -0 tar -cC $HG | tar x

# add new files, cuses warnings if there are no new files
hg -R $HG st --rev $REV:tip -an0 | xargs -0 svn add

# remove deleted files, will cause warnings if there are no deleted files
hg -R $HG st --rev $REV:tip -rn0 | xargs svn rm

Другой способ - использовать tortoisehg , где наряду с расширением rebase возможно клонирование. Это будет следующий рабочий процесс:

hgimportsvn http://svn.server/repo/trunk
cd trunk
hgpullsvn
cd ..
hg clone trunk work
cd work
#Hack Hack Hack

cd ../trunk
hgpullsvn
# if there are new revisions rebase ../work before pull
hg pull ../work
hgpushsvn

#rebase
cd work
hg pull --rebase
0 голосов
/ 17 августа 2010

То, что я в итоге сделал, было довольно хромым (я думаю).Моя цель состояла в том, чтобы взять содержимое моего репозитория Mercurial и перезаписать мою рабочую копию SVN (чтобы я мог передать их в SVN позже).Меня не особо волнует подробная история изменений из Mercurial - коммит будет «свернут» в репозитории SVN.

Неработающий подход, A1: удалить содержимое рабочей копии SVN, а затем скопироватьповерх рабочей копии Mercurial.

Не будет работать, потому что ... папки .svn разрушаются.

Рабочий подход, A2: Используйте команду find, чтобы удалить все, кроме папок .svn израбочая копия СВН.Затем просто скопируйте рабочую копию Mercurial.SVN обнаружит изменения и позволит мне зафиксировать.

Проблемы с подходом A2: 1. Это руководство.2. Если какие-либо каталоги пусты, Mercurial не будет их отслеживать, но они будут в репозитории SVN (у меня не было этой проблемы, но это могло произойти).3. Потерять историю Mercurial на стороне SVN.Вы ничего не можете с этим поделать, поскольку метаданные SVN не так богаты, как у Mercurial.4. Хорошо только, когда один разработчик совершает в репозитории SVN.Если фиксируются несколько разработчиков, вам придется синхронизировать все их изменения, включая синхронизацию этих изменений со всеми клонами.

Преимущества с подходом A2:

1) Это просто.

В корне рабочей копии svn выполните следующую команду:

# delete all files in an SVN working copy, except those
# in the .svn folders; directories are not deleted
find . -path "*.svn" -prune -o -type f -exec rm -v {} +

С помощью файлового менеджера перетащите содержимое рабочей копии Mercurial в рабочую копию SVN (для этого можно использовать скрипт).

Используйте TortoiseSVN для фиксации (вы можете легко проверить все изменения таким образом).

С учетом сказанного, я приму предыдущий ответ, так как это, вероятно, правильный способ сделать это.

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