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

Как разбить папку SVN в свой собственный репозиторий, когда он был переименован?

Я хочу разбить каталог из большого репозитория 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.

4b9b3361

Ответ 1

Эта проблема возникает, когда один из каталогов/файлов, включенных в svndumpfilter изначально, был скопирован или перемещен из раздела дерева, которое не включено.

Чтобы решить эту проблему, используйте script: svndumpfilter3

Ответ 2

У меня была аналогичная проблема с разбиением репозитория.

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

Ответ 3

Я пробовал по крайней мере 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

Вот что я пробовал и не работал:

Ответ 4

Это может потенциально помочь вам: Цитата из 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-адрес источника больше не действителен.

Проблема, конечно, проигрывает историю переименования...

Ответ 5

Я столкнулся с этой проблемой и в итоге использовал 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.

Ответ 7

Я только что успешно перенес проект из существующего комбинированного репо (в Google Code) в свое собственное репо. Сообщения здесь были очень полезными.

Вот что, наконец, помогло мне...

  • Используется svnsync для создания локального зеркала моего репо кода Google, следуя указаниям здесь.
  • 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 перед выполнением нагрузки.

Ответ 8

Почему бы не реплицировать весь репозиторий, выгрузите его в новый. Затем отделите багажник, удалите головку и объедините части, которые вы хотите вернуть, в магистраль от ветки. Затем вы сохранили историю и разделили части, которые хотите получить в новом репозитории.

  • Dump to/trunk
  • Ветвь/соединительная линия в/ветки/магистраль
  • Удалить /trunk
  • Слияние/ветки/соединительная линия/все обратно в /trunk или/trunk/whatever

Таким образом, вы сохранили всю историю и выборочно выбрали нужные вам части.

Ответ 9

Я также ищу ответ на этот вопрос (имея дело с этим сам). Основываясь на ответе Алекса, я нашел http://furius.ca/pubcode/pub/conf/common/bin/svndumpfilter3.html который утверждает, что исправляет некоторые проблемы svndumpfilter2. Я считаю, что это частичное решение.

Хорошее:

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

Концерн:

Внимание!

Некоторые люди сообщают об ошибке с этим script, что он будет создавать пустой файл в большом репозитории. Он отлично поработал для раскола, что я приходилось делать в моем хранилище, но у меня есть нет времени для устранения проблемы, которая возникает для некоторых других репозиториев людей.

Ответ 10

Это дикий и сумасшедший удар в чрезмерно усложняющих вещах, но как насчет импорта репо SVN в git с помощью git-svn/tailor, разделив каталог с помощью git-split, а затем экспортировать его обратно в svn с помощью git-svn/tailor?

Ответ 11

Наткнулся на эту проблему и нашел этот инструмент svndumpsanitizer Казалось, что он хорошо работает, я смог импортировать файл, который он создал, в новый репозиторий.

Ответ 12

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

Теперь вы должны иметь нужную часть из старого репозитория в качестве соединительной линии нового.

Ответ 13

Я вижу, что сейчас это довольно старо, но добавляет ли "-skip-missing-merge-sources" помощь? Кажется, он мог...

Ответ 14

Если вам не нужна вся история, вы можете забрать ее сразу после ошибки. Если ваша ошибка была в редакции 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

Ответ 15

Дополнительная информация о 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).

Ответ 16

просто столкнулся с этой проблемой и написал немного 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

Ответ 17

На основе ответа на 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"

Теперь вы должны иметь нужную часть из старого репозитория в качестве соединительной линии нового.

Ответ 18

Мы разработали Subdivision, инструмент GUI, предназначенный для разделения хранилищ svn.

Подразделение анализирует репозиторий и вычисляет историю файлов по мере их копирования и перемещения по всему репозиторию. Используя эту информацию, ваши выборы интеллектуально дополняются, чтобы избежать ошибок "Недопустимый путь к исходному коду".

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

Подразделение бесплатно для небольших репозиториев.