В SVN, как мне скопировать только подкаталоги каталога в другой каталог?
Вопрос
Обычно я делаю это через командную строку:
cp -rRp /path/to/a\_folder/. /path/to/another\_folder
При этом копируется только содержимое под ним a_ папка Для другая папка.В SVN мне нужно сделать то же самое, но я не могу в этом разобраться.Я всегда заканчиваю с этим:
/path/to/another\_folder/a\_folder
SVN выбрасывает даже тогда, когда я пытаюсь это сделать:
svn copy file:///path/to/a\_folder/* file:///path/to/another\_folder
Он говорит, что его не существует.
Редактировать:
Вероятно, это помогло бы.Структура каталогов для моего проекта выглядит следующим образом:
my_project
/branches
/tags
/trunk
/vendor
/1.1
Мне нужно загрузить содержимое 1.1 из раздела "Поставщик" в магистраль без фактического копирования папки 1.1.
Решение
Рассматривали ли вы возможность использования svn merge?
Учитывая репо, подобное этому:
trunk/a_folder/foo
trunk/a_folder/bar
trunk/new_folder/baz
используйте эти команды для объединения каталогов foo и bar:
cd trunk/new_folder
svn merge -r1:HEAD http://svn/repo/trunk/a_folder .
Другие советы
Как вы, несомненно, обнаружили, копирование в целевой каталог, который уже существует не сработает:
svn cp svn://my_project/vendor/1.1 svn://my_project/trunk
потому что магистраль уже существует, так что в итоге вы получите:
svn://my_project/trunk/1.1
Используя слияние обладает досадным свойством не сохранять историю тега vendor 1.1 в subversion до версии 1.5, в которой было введено отслеживание слияния.Возможно, вам все равно.В этом случае слияние было бы правильным решением:
svn co svn://my_project/trunk trunk-wc svn merge svn://my_project/trunk svn://my_project/vendor/1.1 trunk-wc
Лучший способ прочитать это слияние - это:Сначала определите изменения, необходимые для внесения trunk
идентичный vendor/1.1
, затем примените эти изменения к данной рабочей копии (в данном случае также к trunk).
Я должен отметить, что это слияние эффективно уничтожит все, что было в trunk ранее.Итак, если у вас уже есть локальные (не принадлежащие поставщику) изменения в магистрали, вы захотите применить только изменения между 1.1 и предыдущим удалением поставщика:
svn co svn://my_project/trunk trunk-wc svn merge svn://my_project/vendor/1.0 svn://my_prjoect/vendor/1.1 trunk-wc
Если магистраль существует, но пуста у тебя есть два варианта:замените магистраль или напишите небольшой цикл оболочки:
Замена багажника выглядит примерно так:
svn rm svn://my_project/trunk svn cp svn://my_project/vendor/1.1 svn://my_project/trunk
Использование оболочки (удар):
svn co svn://my_project/trunk trunk svn co svn://my_project/vendor/1.1 1.1 ( cd 1.1 for x in * ; do svn cp $x ../trunk done ) svn ci trunk
По этой ссылке объясняется обходной путь.
http://svn.haxx.se/users/archive-2004-12/1537.shtml
По сути, это говорит о том, что если папка назначения не существует в репозитории, вы получите содержимое вашей исходной папки в папке назначения.
Смотрите приведенный ниже пример.Папка 07-03-2012 не существует в вашем репозитории.Как только вы выполните приведенную ниже команду, вы получите содержимое папки HEAD в 07-03-2012.
svn cp <URL>/HEAD/ <URL>/branches/07-03-2012 -m "test"
Я думаю, что вы хотите, чтобы содержимое багажника попало в /tags/version-1.0/
папка без наличия дополнительного /trunk
папка там.т. е.Это плохо: /tags/version-1.0/trunk/stuff
.Это хорошо: /tags/version-1.0/stuff
.
Чтобы получить это, я выполняю двухэтапный процесс:
svn copy http://localhost/MyProject/trunk http://localhost/MyProject/tags/
# now I have /MyProject/tags/trunk
svn rename http://localhost/MyProject/tags/trunk http://localhost/MyProject/tags/version-1.0
Вы очень, очень близки:
svn copy -m"Copy Directory" file:///path/to/a_folder file:///path/to/another_folder
просто отбрось /*
из первого аргумента.