Система записи - это 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, чтобы применить исправления для подсказок, но пока не нашел решения.
У вас есть несколько вариантов переноса подсказки в каталог 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
То, что я в итоге сделал, было довольно неубедительным (я считать). Моя цель состояла в том, чтобы взять содержимое моего репозитория 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 для фиксации (таким образом вы можете легко проверить все изменения).
С учетом сказанного, я принимаю предыдущий ответ, поскольку это, вероятно, правильный способ сделать это.