Если я правильно прочитал ваш вопрос, это простой вопрос использования svn copy для копирования только нужных каталогов в ветку - в основном, комбинация ответов от Mike Kushner и Ivan Кречетов . Тем не менее, я думаю, что это будет легче понять после выполнения всех шагов, поэтому в оставшейся части этого поста будет создан образец репозитория, в котором будут показаны копии и слияния.
Я предполагаю, что вы используете «стандартную» структуру хранилища, которая на верхнем уровне имеет три подкаталога: транк , ветвь и 1012 * метки *. И что ваши каталоги 10 , 20 , 30 и 40 находятся в транке. Другими словами:
trunk
10
20
30
40
branches
tags
И, как указал Майк, ваша цель будет иметь структуру, которая выглядит следующим образом:
trunk
10
20
30
40
branches
sandbox
20
40
tags
Из вашей публикации неясно (по крайней мере, на момент текущего редактирования), но у вас может быть структура каталогов, в которой 10 , 20 и др. Находятся вверху уровень. В этом случае вам нужно будет создать новый каталог верхнего уровня, который я назову dev , чтобы ваш общий репозиторий выглядел следующим образом:
10
20
30
40
dev
20
40
Обратите внимание, что вы не можете создать dev в 20 . Ну, физически вы можете, но вы почти гарантированно сломаете свою сборку при этом.
Хорошо, давайте рассмотрим пример, в котором мы создаем новый репозиторий и помещаем в него несколько файлов. Вы должны быть в состоянии выполнить команду svnadmin (что вы должны делать, если у вас нет параноидального системного администратора). Поэтому выберите временный каталог и выполните следующие команды (я использую Linux; если вы работаете в Windows, команды будут такими же, но вам нужно будет указать путь для Windows в переменной REPO):
svnadmin create temp.repo
REPO="file://`pwd`/temp.repo"
svn co $REPO temp
Это создает новый (пустой) репозиторий и извлекает его рабочую копию. Вторая строка нуждается в пояснениях: она просто создает URL хранилища из текущего каталога. В моем каталоге рабочего пространства URL выглядит следующим образом:
file:///home/kgregory/Workspace/temp.repo
Хорошо, теперь, когда у вас есть рабочая копия, давайте создадим пример структуры каталогов и некоторые файлы:
cd temp
svn mkdir trunk
svn mkdir branches
svn mkdir tags
svn commit -m "standard repo structure"
pushd trunk
svn mkdir 10
svn mkdir 20
svn mkdir 30
svn mkdir 40
svn commit -m "example sub-project structure"
echo "this doesn't change" > 10/dontchange.txt
svn add 10/dontchange.txt
echo "this does change" > 20/change.txt
svn add 20/change.txt
svn status
svn commit -m "example files"
popd
На данный момент у нас есть примеры каталогов и два файла в них. Вот вывод из find , исключая скрытые каталоги Subversion:
temp, 531> find . | grep -v svn
.
./tags
./trunk
./trunk/10
./trunk/10/dontchange.txt
./trunk/30
./trunk/20
./trunk/20/change.txt
./trunk/40
./branches
Следующим шагом является создание каталога песочницы и создание копий двух каталогов, которые будут в нем:
svn mkdir branches/sandbox
pushd branches/sandbox
svn copy ${REPO}/trunk/20 .
svn copy ${REPO}/trunk/40 .
svn commit -m "make development branch"
popd
Это важная часть: я создаю ветку и копирую в свой рабочий каталог, как копию из хранилища. Обычно вы просто копируете trunk
в дочерний элемент branches
, используя svn copy с двумя аргументами хранилища. Это не работает здесь, потому что мы хотим только двух детей trunk
.
После этого моя рабочая копия выглядит так:
temp, 539> find . | grep -v svn
.
./tags
./trunk
./trunk/10
./trunk/10/dontchange.txt
./trunk/30
./trunk/20
./trunk/20/change.txt
./trunk/40
./branches
./branches/sandbox
./branches/sandbox/20
./branches/sandbox/20/change.txt
./branches/sandbox/40
На этом этапе вы обычно извлекаете ветку разработки в новый рабочий каталог и работаете там. Поэтому я сделаю это (после cd обратно в мой каталог Workspace):
svn co ${REPO}/branches/sandbox sandbox
cd sandbox
А теперь внесите некоторые изменения:
vi 20/change.txt
svn commit -m "changed on branch"
ОК, теперь пришло время слиться с багажником. Итак, вернитесь в рабочее пространство и проверьте только ствол:
svn co ${REPO}/trunk trunk
cd trunk
И сливаться из песочницы. Процесс слияния описан в документах Subversion :
svn merge -r 4:5 ${REPO}/branches/sandbox
svn status
Эта последняя команда должна показать вам, что объединение затронуло только файл 20/change.txt
. Поскольку вы не скопировали 10 или 30 каталогов в ветку, слияние не затронет их.