Я не думаю, что есть способ достичь этого только с SVN. Вам нужна какая-то децентрализованная система контроля версий, например, Git или Mercurial.
Я не знаю, работали ли вы с одним из них, но вы можете добиться того, чего хотите, с обоими.
Вот несколько шагов к моей идее (с точки зрения Mercurial, но это будет очень похоже на Git):
- Инициировать ртутный репозиторий (
hg init
в пустой директории)
- Оформить заказ в хранилище svn
- Добавить все файлы в хранилище Mercurial (
hg addremove
)
- Передать изменения в хранилище Mercurial (
hg commit -m "initial commit"
)
- Клонировать ртутный репозиторий в другом месте (
hg clone /path/to/myrepo .
в пустой директории)
Теперь вы можете работать в этом ртутном клоне и совершать в нем действия. Однако очень важно никогда не выдвигать изменения в исходном хранилище Mercurial.
Для обновления хранилища SVN выполните следующие действия:
- В кассе SVN:
svn update
- Все еще в контрольном пункте SVN
hg addremove; hg commit -m "svn update"
- В каталоге workind (mercurial clone):
hg pull; hg merge; hg commit -m "merging svn update"
Чтобы это работало, рабочий каталог должен быть чистым, т.е. все изменения должны быть зафиксированы.
По сути, мы используем Mercurial как своего рода прокси для хранилища SVN. Вы можете зафиксировать в локальном клоне Mercurial, не изменяя при этом исходный источник, и все равно обновлять из SVN, а затем объединять изменения в локальном клоне Mercurial.
Я точно не знаю, как воспроизвести эти шаги с помощью Git, но я знаю, что это также возможно. Вы можете даже любой другой dvcs, если знаете один из них.
Я полностью согласен с тем, что это решение немного сложнее, но я никогда не находил более простой способ достичь этого. Я работал так 9 месяцев с хранилищем CVS в качестве источника, и у меня никогда не было проблем.
Однако, если вы никогда не слышали о dvcs, git или mercurial, я настоятельно рекомендую вам прочитать некоторую документацию, потому что эти шаги довольно сложны, и все может пойти не так, как надо.
Надеюсь, эта помощь.
EDIT:
Вы также можете использовать SVN externals , но вы не сможете просмотреть и выбрать модификации, которые хотите импортировать в свой репозиторий .
Вам необходимо установить свойство svn: externals для каталога с помощью:
svn propedit externals adirectory
Который откроет редактор, который позволит вам редактировать внешние элементы для каталога adirectory
. Здесь вы добавляете строку для каждого внешнего репозитория, который вы хотите оформить в этом каталоге следующим образом (для каждой строки):
path/where/tocheckout http://svn.example.com/repos/project
В следующий раз, когда вы сделаете обновление, репозиторий svn будет отмечен в указанном каталоге с полной историей.
(я давно использовал svn: externals, возможно, некоторые объяснения неверны, но этого, вероятно, будет достаточно, чтобы получить общую картину)