2010-08-05 2 views
1

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

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

Так у меня есть:

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

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

/dev/repos/svn/project 

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

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

ответ

2

У вас есть несколько вариантов для передачи верхушки вам 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, где наряду с клонированием расширения буфера возможно. Это будет следующий рабочий процесс:

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

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

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

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

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

Проблемы с подходом A2: 1. Это руководство. 2. Если какие-либо каталоги пусты, Mercurial не будет отслеживать их, но они будут в репозитории SVN (у меня не было этой проблемы, но это могло произойти). 3. Потерять историю Меркуриона на стороне 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 для совершения (вы можете легко проверить все изменения).

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

Смежные вопросы