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

Система записи - это 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, чтобы применить исправления для подсказок, но пока не нашел решения.

1
задан Jon Adams 15 February 2012 в 18:43
поделиться

2 ответа

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

hg diff & patch:

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
2
ответ дан 2 September 2019 в 22:23
поделиться

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

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

Не будет работать, потому что ... папки .svn будут уничтожены.

Рабочий подход, A2: используйте команду find для удаления всего, кроме папок .svn, из рабочей копии 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 для фиксации (таким образом вы можете легко проверить все изменения).

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

0
ответ дан 2 September 2019 в 22:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: