Ответ 1
Эта проблема возникает, когда один из каталогов/файлов, включенных в svndumpfilter изначально, был скопирован или перемещен из раздела дерева, которое не включено.
Чтобы решить эту проблему, используйте script: svndumpfilter3
Я хочу разбить каталог из большого репозитория Subversion на собственный репозиторий и сохранить историю файлов в этом каталоге.
Я пробовал обычный способ сделать это сначала
svnadmin dump /path/to/repo > largerepo.dump
cat largerepo.dump | svndumpfilter include my/directory >mydir.dump
но это не сработает, поскольку каталог был перемещен и скопирован за эти годы, и файлы были перемещены в него и из него в другие части репозитория. В результате их много:
svndumpfilter: Invalid copy source path '/some/old/path'
Следующее, что я пробовал, это включить те /some/old/path
, как они появляются, и после длинного длинного списка файлов и каталогов, включенных в svndumpfilter, НО импорт импортируемого дампа не создает те же файлы, что и текущий каталог есть.
Итак, как правильно разбить каталог из этого репозитория, сохранив историю?
РЕДАКТИРОВАТЬ: Я специально хочу, чтобы trunk/myproj
являлся стволом в новом репозитории PLUS, в новом репозитории не было ни одного другого старого материала, т.е. не должно быть возможности для кого-либо обновить до старой версии до разделения и получить/увидеть файлы.
Решение svndumpfilter, которое я пробовал, достигнет именно этого, к сожалению, это не выполнимо, поскольку путь/файлы были перемещены. Решение ng не подходит, поскольку в основном это клон + удаление дополнительных функций, которые сохраняют всю историю, а не только соответствующую историю myproj.
Эта проблема возникает, когда один из каталогов/файлов, включенных в svndumpfilter изначально, был скопирован или перемещен из раздела дерева, которое не включено.
Чтобы решить эту проблему, используйте script: svndumpfilter3
У меня была аналогичная проблема с разбиением репозитория.
svndumpfilter: Invalid copy source path /dir/old_dir
Что я сделал, чтобы обойти эту проблему, было включение дополнительных старых каталогов, которые запрашивались, или что вы знаете, что переехали. В моем случае я переместил 3 каталога в другой каталог.
например. Перемещенные папки A, B, C в папку D
cat project.dump | svndumpfilter include A B C D > new.dump
Это, казалось, решило мою проблему. Мне удалось отделить папку D от остальной части репо. На оборотной стороне, если исключить D, я не получил ошибку, я бы предположил, что удаление D не требовало ссылок/истории на A, B, C
Я пробовал по крайней мере 4 разных приложения для этого, единственное, что действительно работало , использовало svndumpfilterIN:
cd /usr/local/bin/
sudo wget --no-check-certificate https://raw.github.com/jasperlee108/svndumpfilterIN/master/svndumpfilter.py
sudo chmod +x svndumpfilter.py
# To be sure nothing will happened on the original repo :
cp -au /path/to/repo /tmp/largerepo.repo/
svnadmin dump /path/to/repo > /tmp/largerepo.dump
svndumpfilter.py /tmp/largerepo.dump --repo=/tmp/largerepo.repo --output-dump=/tmp/mydir.dump include my/directory
Вот что я пробовал и не работал:
Это может потенциально помочь вам: Цитата из http://svnbook.red-bean.com/en/1.5/svn.reposadmin.maint.html#svn.reposadmin.maint.replication
В Subversion 1.5 svnsync увеличил способность зеркалировать подмножество репозитория, а не всего. Процесс настройки и поддержки такого зеркала точно такой же, как при зеркалировании всего репозитория, за исключением того, что вместо указания корневого URL исходного репозитория при запуске svnsync init вы указываете URL-адрес какого-либо подкаталога в этом репозитории. Синхронизация с этим зеркалом теперь будет копировать только биты, которые были изменены в подкаталоге исходного репозитория. Однако есть некоторые ограничения для этой поддержки. Во-первых, вы не можете зеркалировать несколько непересекающихся подкаталогов исходного репозитория в один зеркальный репозиторий - вам нужно вместо этого отобразить некоторые родительские каталоги, которые являются общими для обоих. Во-вторых, логика фильтрации полностью основана на пути, поэтому, если подкаталог, который вы зеркалируете, был переименован в какой-то момент в прошлом, ваше зеркало будет содержать только изменения, так как каталог появился в указанном вами URL-адресе. Аналогично, если исходный подкаталог будет переименован в будущем, ваши процессы синхронизации перестанут отражать данные в точке, где указанный URL-адрес источника больше не действителен.
Проблема, конечно, проигрывает историю переименования...
Я столкнулся с этой проблемой и в итоге использовал svndumpfilter2.
В частности, эта команда:
sudo svnadmin dump /home/setup/svn/repos/main_repl | sudo ./svndumpfilter2.py /home/setup/svn/repos/main_repl Development QA compliance > ~/main_repl_dump.trim
У меня получилась ошибка из памяти, однако, поскольку я запускал svn на виртуальной машине, я просто столкнулся с памятью до 2G. Хотя я понимаю, что это не может быть вариантом для всех, я заметил, что он работает намного быстрее, чем с 512M. (2G, вероятно, не был необходим).
В настоящее время он обрабатывает версию 18 631.
В случае, если кто-то задается вопросом, причиной, по которой мне нужно было вырвать часть репо, было то, что мы создавали теги/копии для распространения для реализации файлов на другом пути репо. По какой-то причине этот процесс заставлял репо набирать огромные масштабы. (Сейчас мы на 17G.)
Я делаю это на репликации репликации SVN версии 1.5.6 на Debian Lenny, 5.0.4.
auriarte ссылка на svndumpfilter3 404's. Здесь рабочая ссылка (по состоянию на 2011-01-31), для тех, кто ее ищет: http://furius.ca/pubcode/pub/conf/bin/svndumpfilter3.html
Я только что успешно перенес проект из существующего комбинированного репо (в Google Code) в свое собственное репо. Сообщения здесь были очень полезными.
Вот что, наконец, помогло мне...
svnadmin dump to foo-dumpfile
cat dumpfile | ./svndumpfilter3 --untangle mymirrorrepo trunk/foo > foo-dumpfile
svnadmin create foorepo
svnadmin load foorepo --ignore-uuid < foo-dumpfile
Параметру --untangle
на шаге 3 удалось разрешить все проблемы с контуром, которые остановили svndumpfilter и svndumpfilter2.
Сначала, на шаге 5, я застрял на ошибке:
<<< Started new transaction, based on original revision 2
svnadmin: File not found: transaction '1-1', path 'trunk/foo'
Но этот post в блоге Charles Calvert объяснил, что все, что требовалось, - это создать сундук в foorepo перед выполнением нагрузки.
Почему бы не реплицировать весь репозиторий, выгрузите его в новый. Затем отделите багажник, удалите головку и объедините части, которые вы хотите вернуть, в магистраль от ветки. Затем вы сохранили историю и разделили части, которые хотите получить в новом репозитории.
Таким образом, вы сохранили всю историю и выборочно выбрали нужные вам части.
Я также ищу ответ на этот вопрос (имея дело с этим сам). Основываясь на ответе Алекса, я нашел http://furius.ca/pubcode/pub/conf/common/bin/svndumpfilter3.html который утверждает, что исправляет некоторые проблемы svndumpfilter2. Я считаю, что это частичное решение.
Хорошее:
Переписывание Subversion svndumpfilter в чистом Python, что позволяет распутывать перемещение/копирование операции между включены наборы файлов/директорий, по превращая их в дополнения. если ты используйте этот параметр, он выбирает исходные файлы из данного хранилище.
Концерн:
Внимание!
Некоторые люди сообщают об ошибке с этим script, что он будет создавать пустой файл в большом репозитории. Он отлично поработал для раскола, что я приходилось делать в моем хранилище, но у меня есть нет времени для устранения проблемы, которая возникает для некоторых других репозиториев людей.
Это дикий и сумасшедший удар в чрезмерно усложняющих вещах, но как насчет импорта репо SVN в git с помощью git-svn/tailor, разделив каталог с помощью git-split, а затем экспортировать его обратно в svn с помощью git-svn/tailor?
Наткнулся на эту проблему и нашел этот инструмент svndumpsanitizer Казалось, что он хорошо работает, я смог импортировать файл, который он создал, в новый репозиторий.
Конкретные команды следующие: я собираюсь предположить, что репозиторий размещен на сервере http (s)://, хотя те же команды будут работать для svn://или file://.
svnadmin dump /path/to/repository > dumpfile
svnadmin create /path/to/new_repository
svnadmin load /path/to/new_repository < dumpfile
svn co https://localhost/svn/new_repository_url new_repository_checkout
cd new_repository_checkout
svn move https://localhost/svn/new_repository_url/trunk https://localhost/svn/new_repository_url/branches/head -m "Moving HEAD to branches"
svn move https://localhost/svn/new_repository_url/branches/head/whatever https://localhost/svn/new_repository_url/trunk -m "Creating new trunk"
svn update
cd branches
svn remove head
svn commit
Теперь вы должны иметь нужную часть из старого репозитория в качестве соединительной линии нового.
Я вижу, что сейчас это довольно старо, но добавляет ли "-skip-missing-merge-sources" помощь? Кажется, он мог...
Если вам не нужна вся история, вы можете забрать ее сразу после ошибки. Если ваша ошибка была в редакции 412, вы можете попробовать выбрать ее сразу после:
svnadmin dump /path/to/repo -r 413:HEAD > largerepo.dump
Я понимаю, что это не может быть идеальным решением, но оно может быть достаточно хорошим в вашем случае.
Вы также можете сделать это всего за один шаг
svnadmin dump /path/to/repo -r 413:HEAD | svndumpfilter include my/directory > mydir.dump
Дополнительная информация о svndumpfilter и о том, как исправить - http://blog.rlucas.net/uncategorized/some-gotchas-with-using-svndumpfilter/
Или вы можете попробовать заменить svndumpfilter script, теперь называемый svndumpfilter2 - http://cogo.wordpress.com/2009/03/10/problems-with-svndumpfilter/
Я не пробовал это script, мне нужно некоторое время, чтобы сделать резервное копирование репо, чтобы проверить на этом (у меня есть резервный дамп для воспроизведения, но в Windows, и это linux script).
просто столкнулся с этой проблемой и написал немного script, чтобы повторить сбрасывание до тех пор, пока не будут разрешены все недопустимые пути источника.
#!/usr/bin/env ruby
require 'open3'
include Open3
paths = [ "/your/path" ]
command = ""
new_path = "xx"
while (! new_path.nil?)
lines = nil
popen3(" svndumpfilter include #{paths.join(' ')} > svn.result.dump < svn.original.dump") do |i, o, err|
i.close
puts "Processing, please wait ..."
lines = err.readlines
end
new_path = nil
lines.each do |line|
if line =~ /Invalid copy source path '(.*)'/
new_path = $1
end
end
puts "Adding #{new_path}"
paths << new_path
end
На основе ответа на ng., но с фильтрацией и сбросом пустых версий.
Шаг 1. Дамп и фильтр:
svnadmin dump /path/to/repository > fulldumpfile
svndumpfilter include trunk/the/part/you/want --drop-empty-revs --renumber-revs < fulldumpfile > dumpfile
Шаг 2. Создайте новое репо. (обратите внимание, что это также можно сделать, например, с помощью Tortoise SVN)
svnadmin create /path/to/new_repo
Не забудьте добавить все, что вам нужно, чтобы проверить (разрешения и т.д.).
Шаг 3. Оформить заказ и добавить базовую папку (также можно сделать, например, с помощью Tortoise SVN)
svn checkout http://localhost/new_repo /some/checkout/path/newrepo
cd /some/checkout/path/newrepo
# to be able to create "trunk/the/part/you/want" you will need to add parent dir:
mkdir -p trunk/the/part/you
svn add trunk
svn commit -m "old base"
Шаг 4. Загруженный фильтр
svnadmin load /path/to/new_repo < dumpfile
Шаг 5. Переместите старый корень в новый корень (также можно сделать, например, с помощью Tortoise SVN)
cd /some/checkout/path/newrepo
svn update
svn move trunk/the/part/you/want/* trunk/
svn move tags/the/part/you/want/* tags/
svn move branches/the/part/you/want/* branches/
svn commit -m "re-structure base"
Теперь вы должны иметь нужную часть из старого репозитория в качестве соединительной линии нового.
Мы разработали Subdivision, инструмент GUI, предназначенный для разделения хранилищ svn.
Подразделение анализирует репозиторий и вычисляет историю файлов по мере их копирования и перемещения по всему репозиторию. Используя эту информацию, ваши выборы интеллектуально дополняются, чтобы избежать ошибок "Недопустимый путь к исходному коду".
В дополнение к разбиению репозитория, Subdivision может использоваться для удаления файлов из репозитория, а также для извлечения файлов и папок в новый репозиторий.
Подразделение бесплатно для небольших репозиториев.