Как преобразовать существующий каталог в рабочую копию SVN (WC) без замены локальных файлов?

У меня есть большой репозиторий Subversion с почти 15 ГБ данных, разбросанных по примерно 500 000 файлов. Теперь мне нужно проверить этот репозиторий на удаленном хосте, что займет несколько дней.

Хост, на который я обращаюсь, уже имеет полную копию данных в репозитории. Но поскольку файлы не были извлечены непосредственно из репозитория, они не являются рабочей копией (без папок ".svn").

Я хотел бы избежать копирования всех этих данных по сети, особенно если они уже существуют на целевом хосте. Есть ли трюк, который я могу использовать, чтобы превратить уже существующий каталог в рабочую копию, не заменяя локальные файлы идентичными копиями из репозитория?


person weston    schedule 13.05.2009    source источник
comment
Просто из любопытства: что вы храните в этом хранилище? Я никогда не слышал о таком большом репо.   -  person sleske    schedule 14.05.2009
comment
Необработанный звук, в основном устная речь.   -  person weston    schedule 14.05.2009
comment
На что это похоже, так это на то, как вернуть каталоги .svn после их очистки, или я сделал экспорт, который занял несколько дней. Но я тоже хотел файлы .svn...   -  person lilbyrdie    schedule 22.06.2011
comment
не могли бы вы использовать rsync с --ignore-existing и продублировать репозиторий (т.е. .svn каталоги)? (не уверен, что этот мир работает, просто думаю..)   -  person Anil    schedule 28.01.2014


Ответы (10)


Начиная с SVN 1.7 (но не раньше) вы можете легко сделать это с помощью:

svn co --force http://path/to/repo

Это будет учитывать локальную копию как существующую, и вы увидите «E» для существующего перед каждым именем файла в выводе: E some/existing/file

Если файл отличается (новый или модифицированный) от репозитория, он также обработает это изящно в соответствии с книга:

До версии 1.7 Subversion по умолчанию выдавала жалобу, если вы пытаетесь извлечь каталог поверх существующего каталога, который содержит файлы или подкаталоги, созданные самим процессом извлечения. Subversion 1.7 обрабатывает эту ситуацию по-другому, позволяя продолжить проверку, но помечая любые мешающие объекты как конфликты дерева. Используйте параметр --force, чтобы переопределить эту защиту. При извлечении с параметром --force любой неверсионный файл в целевом дереве извлечения, который обычно препятствует извлечению, все равно станет версионным, но Subversion сохранит его содержимое как есть. Если это содержимое отличается от файла репозитория по этому пути (который был загружен как часть проверки), файл будет иметь локальные модификации — изменения, необходимые для преобразования извлечённого вами версионного файла в неверсионный файл, который был у вас до проверки. out — когда проверка завершится.

Также обратите внимание, что SVN 1.7 может привести к ситуациям, когда это более распространенная проблема (возможно, это мотивирует решение). Я столкнулся с этой проблемой при перемещении каталога sub в новое место на диске. В версиях до 1.7 это привело бы к перемещению каталога .svn вместе с ним, и он прекрасно стоял бы один. В версии 1.7 каталог стал фактически неверсионным. Но svn co --force спас положение.

person Rhubarb    schedule 07.10.2014
comment
Однако это добавляет в локальный каталог файлы, которые были в репозитории (если они не найдены локально). Как я мог этого избежать? и скажите svn: это новая рабочая копия, разберитесь с ней! - person yota; 08.03.2016

Существует команда перемещения: http://svnbook.red-bean.com/en/1.1/re27.html

EDIT: если локальные файлы не связаны с репозиторием, вы можете создать локальный репозиторий, импортировать в него файлы, а затем использовать команду relocate.

В качестве альтернативы, если у вас есть физический доступ к обеим машинам, вы можете проверить репозиторий локально, а затем скопировать файлы на удаленную машину через внешний жесткий диск.

person Jonathan Parker    schedule 14.05.2009
comment
Я не понимаю, как вы могли бы использовать relocate здесь. переместите только метада обновлений в папки .svn. Согласно ОП, папок .svn нет. - person Wim Coenen; 14.05.2009
comment
Я сомневаюсь, что это сработает, потому что вы можете перемещаться только в репозиторий с тем же UID репозитория. - person Peter Parker; 14.05.2009
comment
В документации, на которую я ссылался выше, говорится: если рабочая копия по-прежнему отражает тот же каталог репозитория, но местоположение самого репозитория изменилось, используйте переключатель svn --relocate. - person Jonathan Parker; 18.05.2009

Вы можете попробовать использовать rsync, если у вас уже есть рабочая копия под управлением svn где-то еще в сети.

person Community    schedule 14.05.2009
comment
Это не такая уж плохая идея, но, как упоминалось в другом комментарии, папка .svn/text-base содержит нетронутые копии всех ваших файлов репо, поэтому rsync в любом случае скопирует все данные. Возможно, вы могли бы указать rsync игнорировать репликацию текстовой базы, а затем написать сценарий для заполнения текстовой базы после синхронизации папок .svn. - person weston; 14.05.2009

svn co --force https://PATH/TO/REPO/ .

Где . в конце предполагает, что вы уже находитесь внутри каталога, который вы хотите превратить в рабочую копию SVN.

Например, если вы хотите сделать свой каталог public_html рабочей копией репозитория svn:

cd /home/username/public_html; svn co --force https://PATH/TO/REPO/ .

person BornSupercharged    schedule 16.03.2015
comment
Чем этот ответ лучше принятого в настоящее время ответа, который содержит ту же информацию? - person Jeffrey Bosboom; 16.03.2015
comment
В принятом ответе не учитывается важность явного выражения текущего каталога. - person Ken Ingram; 27.05.2017

Следующая команда предназначена для удаления всех каталогов .svn.

chmod -R 0755 project_dir
find /project_dir -type d -name .svn -exec rm -rf '{}' +

Если у вас уже есть тестовая версия, вы можете попытаться скопировать эти .svn папки, заменив rm на cp. Хотя я не пробовал.

person Wen    schedule 04.01.2013

Вы можете просто проверить репозиторий локально, а затем передать только каталоги .svn (осторожно, они содержат копии файлов рабочей области, очевидно, вы не хотите их копировать). Это должно сработать, так как у вас будут точные файлы правильной рабочей копии.

Конечно, вам придется написать какой-то скрипт для передачи файлов .svn. В системе Unix вы можете сделать это с помощью find и friends.

person sleske    schedule 14.05.2009
comment
-1 Если у него около 500 000 файлов, представьте, что нужно «аккуратно» переместить все папки .svn? - person victor hugo; 14.05.2009
comment
Конечно, вы бы использовали какой-нибудь сценарий. Осторожно было предупредить о потенциальной проблеме при написании такого скрипта. - person sleske; 14.05.2009
comment
Я думал об этом, но, как заметил Виктор, это может быть довольно утомительно с таким большим репо. Кроме того, папки .svn/text-base рабочей копии содержат нетронутые копии всех файлов в репозитории, поэтому даже для копирования только папок .svn все равно потребуется полная копия данных. - person weston; 14.05.2009
comment
Да, конечно, именно поэтому я упомянул сценарий. Я не ожидаю, что кто-то будет копировать все вручную :-/. И, конечно же, вы не будете копировать материал в текстовую базу, вы только создадите пустые каталоги «.svn/text-base», а затем скопируете существующие файлы из места назначения в текстовую базу. Да, для этого может потребоваться немного программирования, но это все же лучше, чем повторное копирование 15 ГиБ. - person sleske; 15.05.2009

Ни одна из нативных svn-команд не будет проверять существующие файлы на совпадения и не загружать их.

Какой протокол вы используете для доступа к репозиторию? Если это https, это может быть вашей проблемой. Попробуйте собственный протокол svn (используя svnserve) или svn+ssh. Или, возможно, даже выполнить проверку через URL-адрес file:// на сервере, на котором размещен репозиторий svn, а затем использовать rsync для передачи по сети.

Пока вы не платите за пропускную способность в расчете на байт, может иметь смысл позволить "svn co --force" работать в режиме nice или (START /LOW в Windows) и не тратить впустую ваши ресурсы. собственное время. Это не сделает ничего в локальной файловой системе недоступным во время процесса проверки.

Наконец, я не могу понять, почему ваша проверка такая медленная... у нас есть 500 КБ файловых репозиториев, которые извлекаются примерно за 6 минут через https в гигабитной локальной сети. Конечно, все файлы намного меньше (всего 1 ГБ). Насколько далеко вы находитесь от сервера с точки зрения задержки?

person rmalayter    schedule 15.09.2011

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

Используйте Subversion 1.7, чтобы не было .svn с нетронутыми копиями файлов.

person Diego Fernández Durán    schedule 27.08.2012

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

Единственный способ подключить его к удаленному репозиторию SVN — выполнить следующие действия из найденного мною блога (Восстановление сломанной рабочей копии Subversion):

# Backup your project in case you run into trouble
cp -Rp /path/to/project /temporary/location

# Strip out the old .svn folders (if any)
find /path/to/project -name .svn -print0 | xargs -0 rm -rf

# Check out a clean copy
svn co http://repo/location /temporary/location2

# Move the .svn folders from the clean copy into the correct relative
# place in the broken copy
cd /temporary/location2
find . -name .svn -print0 | xargs -0 -I {} mv '{}' '/path/to/project/{}'

# Remove the clean copy
rm -rf /temporary/location2
person Lucky Dog    schedule 27.08.2013

Я не верю, что есть решение без передачи этих 15 ГБ в пункт назначения. Вероятно, было бы быстрее и проще скопировать репозиторий туда и выполнить локальную проверку.

person Gleb    schedule 14.05.2009
comment
Что ж, забавно, что вы предлагаете это, потому что я пытался проверить только локальную рабочую копию на самом сервере. Даже локальная проверка занимает больше дня, и это не включает время, необходимое для создания дампа/копирования/загрузки в новый репозиторий на удаленном хосте. - person weston; 14.05.2009