Традиционный способ сделать то, что вы пытаетесь сделать, - выгрузить свой репозиторий в файл дампа, использовать svndumpfilter, чтобы включить или исключить файлы в соответствии с вашими потребностями, а затем загрузить отфильтрованный файл дампа в новый репозиторий.Этот подход хорошо работает для простых изменений, таких как удаление пары файлов из хранилища.
Все становится немного сложнее, когда в хранилище содержатся файлы и копии.
Давайте рассмотрим простейший пример, когда папка проекта с именем MyProject
была переименована в истории в TheProject
.Другой файл с именем TheProject/copiedfile.txt
был впоследствии скопирован в TheProject
из папки AnotherLocation
.Элементарная древовидная структура может выглядеть следующим образом.
...
+ AnotherLocation
|--- copiedfile.txt
|--- unwantedfile.txt
+ TheProject
|--- copiedfile.txt
|--- otherfile.txt
...
Вы бы хотели, чтобы TheProject
имел свой новый репозиторий.Таким образом, вы выгружаете свой репозиторий в файл и используете svndumpfilter для включения только TheProject
, поскольку это имя проекта, которое вы видите в ревизии HEAD.
svndumpfilter include /TheProject < input.dump > output.dump
К сожалению, вы получаете эту ошибку от svndumpfilter
svndumpfilter: E200003: Invalid copy source path '/MyProject'
Это потому, что раньше TheProject
назывался MyProject
, и в прошлом он был переименован.Поскольку переименование - это, по сути, удаление и копирование, svndumpfilter не может найти источник копии, которая создает TheProject
, и правильно выводит сообщение об ошибке.Поэтому мы снова пытаемся выполнить следующую команду, включающую также MyProject
svndumpfilter include /TheProject /MyProject < input.dump > output.dump
Svndumfilter теперь появляется с другой ошибкой.
svndumpfilter: E200003: Invalid copy source path '/AnotherLocation/copiedfile.txt'
Да, это потому, что copiedfile.txt
былоскопировано с AnotherLocation
на TheProject
.Поэтому мы должны также включить этот файл, так как иначе мы не смогли бы скопировать его в `TheProject '.Попробуем еще раз.
svndumpfilter include /TheProject /MyProject /AnotherLocation/copiedfile.txt < input.dump > output.dump
Операция прошла успешно!В третий раз повезло, кажется!
Давайте попробуем загрузить наш отфильтрованный файл дампа в хранилище.
svnadmin create newrepo
svnadmin load newrepo < output.dump
Не так уж повезло в конце концов!Следующая ошибка возникает при загрузке
* editing path : AnotherLocation/copiedfile.txt ...svnadmin: E160013: File not found: transaction '1-1', path '/AnotherLocation/copiedfile.txt'
А!это потому, что мы забыли включить AnotherLocation
, что необходимо, поскольку это родительская папка copiedfile.txt
svndumpfilter include /TheProject /MyProject /AnotherLocation < input.dump > output.dump
Хорошо, эта команда работает и загрузка также работает.К сожалению, теперь мы включили /AnotherLocation/unwantedfile.txt
.Отсюда делается вывод, что использование svndumpfilter include
на самом деле не работает, поскольку не дает нам детализации, к которой мы стремимся.Мы должны сделать все, используя svndumpfilter exclude
, чтобы исключить все, что нам не нужно, и в результате мы получим репозиторий с необходимыми нам файлами.Достаточно сказать, что изобилует собственным набором проблем.Например, довольно легко исключить файлы, которые действительно требуются в хранилище.Если люди хотят пример этого, я могу расширить этот ответ.
Должен быть лучший путь.Оказывается, есть, но это коммерческое предложение.Мы разработали инструмент под названием Subdivision , который специализируется на извлечении файлов и папок из хранилища Subversion.Он также может удалять (или стирать) файлы из хранилища Subversion, а также разбивать хранилище на две части, гарантируя, что ни один из этих двух хранилищ не пропущен.Что делает Subdivision сияющим, так это тот факт, что он хранит в памяти представление всего хранилища и запускает алгоритмы, необходимые для решения всех проблем, с которыми мы столкнулись в приведенном выше примере.Это означает, что вы получаете необходимую степень детализации при извлечении нужных файлов только при сохранении времени пользователя, поскольку операция завершается за один проход.