SVN частичное отделение - PullRequest
3 голосов
/ 26 ноября 2009

Я новичок в SVN, так что это может быть простой вопрос.

У нас есть «ствол» с каталогами 1-го уровня:

10 <-- documents
20 <-- source code, db scripts, ...
30 <-- documents
40 <-- referenced 3rd party library-es

Я сделал ветку "проявить" из "ствола". В «разработке» мы меняем наш исходный код и после тестирования сливаем его в «транк».

Проблема в том, что в каталогах "10" и "30" хранятся * .doc файлы, которые не нужны для разработки, поэтому ТРЕБУЕТСЯ, чтобы ветвь "развернуть" не имела этих каталогов.

Решение должно еще:

  1. разрешить «svn update» в корневой папке «развернутой» рабочей копии, (20 и 40)
  2. это обновление не следует создавать заново каталоги 10 и 30 и
  3. Конечно, слияние «развернуть» с «стволом» НЕ должно удалять 10 или 30 из «ствола».

EDIT: Я забыл упомянуть, что «исходный код» находится не только в 20. Есть ссылки на dll-ы, сценарии сборки и т. Д., Которые также находятся в каталоге 1-го уровня, скажем, 40.

Ответы [ 8 ]

11 голосов
/ 30 ноября 2009

Если я правильно прочитал ваш вопрос, это простой вопрос использования 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 каталогов в ветку, слияние не затронет их.

2 голосов
/ 30 ноября 2009

afaik вы не можете сделать это с той структурой хранилища, которая у вас есть.

Я предлагаю вам реструктурировать свой репозиторий, чтобы 10, 20, 40 и другие связанные с кодом ресурсы были перемещены в новую папку 1-го уровня. Таким образом вы избежите этой ситуации и упростите возможность захватывать только ресурсы, связанные с кодом.

2 голосов
/ 26 ноября 2009

То, что вы хотите сделать, это создать копию «20» где-нибудь в вашем SVN-дереве, с которой вы можете сливаться взад и вперед. Общая структура

repo
---> trunk
    ---> 10 
    ---> 20
    ---> 30
---> branches
    ---> sandboxes
        ---> develop <branch of 20>
---> tags

Когда вы хотите обновить «разработке», вы либо создаете новую ветвь «20» в песочницах, либо выполняете слияние из 20 для разработки. Когда вы хотите, чтобы изменения в "разработке" вернулись в ваш ствол, вы сливаетесь другим путем. Ваши разработчики должны проверить копию «Develop» (или создать свои собственные ветки на основе «Develop»)

1 голос
/ 26 ноября 2009

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

0 голосов
/ 01 декабря 2009

Из вашего комментария:

Мы хотим предотвратить изменение документов в 10 и 30. Они должны быть изменены только в стволе.

Рассматривали ли вы использование svn: externals в ветви develop для 10 и 30? Относительная ссылка из root с использованием ^ /, вероятно, будет хорошим подходом.

Таким образом, хотя 10, 20, 30 и 40 будут доступны в ветви, на 10 и 30 все еще ссылаются из транка. Затем вы можете при необходимости определить свои права доступа .

1017 * репо * ..-> багажник
....-> 10
....-> 20
....-> 30
....-> 40
..-> филиалы
....-> развивать
......-> 10 (живет на сундуке, svn: внешне ^ / сундук / 10)
......-> 20 (живет на ветке, сливаюсь в ствол)
......-> 30 (живет на стволе, svn: внешне ^ / ствол / 30)
......-> 40 (живет на ветке, сливаюсь в ствол)

0 голосов
/ 01 декабря 2009

Способ, которым вы структурируете свой проект, наряду с ограничениями docs dir, не соответствует модели SVN "из коробки".

Некоторые идеи:

  • Переместите docs dir вне сундука и добавьте его как svn:external
  • Переместите docs dir за пределы транка и получите скрипт сборки, объединяющий транк и docs dir
  • Слияние с использованием сценария (вместо прямого svn merge), и заставить сценарий применять правила
0 голосов
/ 30 ноября 2009

Мы делаем что-то вроде этого:

-repo: Assemblies
--SomeAssembly
---Current
---v1.0
---v1.1
-repo: Source
--trunk
---Code
---Assemblies (external from Assemblies repo)
--branches
---v1.0
----Code
----Assemblies (external from Assemblies repo)
--Documents

В этом примере сторонние сборки имеют свой собственный репозиторий. Таким образом, вы не поддерживаете разные версии в каждой ветви и транке. Как примечание, последняя версия любой сборки дублируется в папке «Текущая» для каждой сборки. Это позволяет обновлять сборку без необходимости обновлять ссылки во всех ваших проектах. Это может не быть проблемой в вашем домене, но в нашем случае это была большая боль.

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

0 голосов
/ 26 ноября 2009

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

svn cp http://example.com/svnrepo/trunk/source_code http://example.com/svnrepo/branches/development/source_code

cd ./source_code
svn sw http://example.com/svnrepo/branches/development/source_code

Внести изменения, зафиксировать. Тогда, давайте слиться в ствол:

svn sw http://example.com/svnrepo/trunk/source_code
cd ..
svn merge -r [start_rev]:HEAD http://example.com/svnrepo/branches/development/source_code ./source_code

Обзор, чтобы убедиться, что все в порядке:

svn diff | less

А потом коммит. Готово.

...