Как разделить папку SVN на собственный репозиторий, когда она была переименована? - PullRequest
41 голосов
/ 11 января 2009

Я хочу разделить каталог из большого репозитория 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 был стволом в новом хранилище. ПЛЮС, чтобы в новом хранилище не было никаких других старых вещей, т.е. ни у кого не должно быть возможности обновить старую версию до разделения и получить / просмотреть файлы.

Решение svndumpfilter, которое я пробовал, достигло бы именно этого, к сожалению, его невозможно выполнить, так как путь / файлы были перемещены. Решение от ng неприемлемо, так как в основном это клон + удаление дополнений, которые хранят ВСЕ историю, а не только релевантную историю myproj.

Ответы [ 18 ]

2 голосов
/ 12 декабря 2011

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

1 голос
/ 11 января 2009

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

Теперь у вас должна быть та часть, которую вы хотите получить из старого хранилища, в качестве ствола нового.

0 голосов
/ 04 февраля 2016

Мы разработали Subdivision , инструмент с графическим интерфейсом, предназначенный для разделения svn-репозиториев.

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

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

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

0 голосов
/ 09 мая 2014

На основе ответа по номеру, но с фильтрацией и удалением пустых ревизий.

Шаг 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"

Теперь у вас должна быть та часть, которую вы хотите получить из старого хранилища, в качестве ствола нового.

0 голосов
/ 28 апреля 2009

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

0 голосов
/ 07 мая 2009

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

Еще немного информации о svndumpfilter и как его исправить - http://blog.rlucas.net/uncategorized/some-gotchas-with-using-svndumpfilter/

Или вы можете попробовать скрипт замены svndumpfilter, теперь он называется svndumpfilter2 - http://cogo.wordpress.com/2009/03/10/problems-with-svndumpfilter/

Я не пробовал этот сценарий, потому что мне нужно некоторое время, чтобы сделать резервную копию репозитория, чтобы проверить его (у меня есть резервный дамп, с которым можно поиграть, но на Windows, и это скрипт linux).

0 голосов
/ 08 мая 2010

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

#!/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
...