Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Как и SVN 1.7 (но не раньше), вы можете сделать это легко:

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

Следующая команда - удалить все каталоги .svn.

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

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

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

Ответ 8

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

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

Ответ 9

У меня был рабочий репозиторий на моем локальном компьютере, который удалил все его папки .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

Ответ 10

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

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

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

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