В SVN, как мне копировать только подкаталоги каталога в другой каталог?
Через командную строку я обычно делаю это:
cp -rRp /path/to/a\_folder/. /path/to/another\_folder
Это копирует только содержимое под a_folder в another_folder. В SVN мне нужно сделать то же самое, но не могу понять. Я всегда получаю следующее:
/path/to/another\_folder/a\_folder
SVN срабатывает даже при попытке:
svn copy file:///path/to/a\_folder/* file:///path/to/another\_folder
Он говорит, что не существует.
EDIT:
Это, вероятно, поможет. Структура каталогов для моего проекта выглядит так:
my_project
/branches
/tags
/trunk
/vendor
/1.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 .
Ответ 2
Как вы, конечно же, обнаружили, копирование в целевой каталог, который уже существует, не будет работать:
svn cp svn://my_project/vendor/1.1 svn://my_project/trunk
потому что соединительная линия уже существует, поэтому вы получите:
svn://my_project/trunk/1.1
Использование merge имеет несчастливое свойство не сохранять историю тега поставщика 1.1 в подрывной версии до 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
, а затем применить эти изменения к данной рабочей копии (также в случае сундука).
Я должен указать, что это слияние эффективно удалит все, что было в багажнике ранее. Итак, если у вас есть локальные (не относящиеся к вендору) модификации уже на соединительной линии, вы хотите применить только изменения между 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
Использование оболочки (bash):
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
Ответ 3
Эта ссылка объясняет обходной путь.
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"
Ответ 4
Я думаю, что вы хотите, чтобы содержимое соединительной линии попало в папку /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
Ответ 5
Ты очень, очень близко:
svn copy -m"Copy Directory" file:///path/to/a_folder file:///path/to/another_folder
просто отпустите /*
из первого аргумента.