В SVN, как мне скопировать только подкаталоги каталога в другой каталог? - PullRequest
23 голосов
/ 04 ноября 2008

В командной строке я обычно делаю это:

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.

Ответы [ 5 ]

20 голосов
/ 04 ноября 2008

Как вы наверняка обнаружили, копирование в целевой каталог, который уже существует , не будет работать:

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, затем применить эти изменения к данной рабочей копии (в данном случае также к стволу).

Я должен отметить, что это слияние будет эффективно уничтожать все, что было в стволе ранее. Итак, если у вас уже есть локальные (не вендорные) модификации в магистрали, вам нужно применить только изменения между 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
9 голосов
/ 04 ноября 2008

Рассматривали ли вы использовать 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 .
6 голосов
/ 03 июля 2012

Эта ссылка объясняет обходной путь.

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"
3 голосов
/ 05 апреля 2012

Я думаю, что вам нужно, чтобы содержимое соединительной линии попало в папку /tags/version-1.0/ без дополнительной папки /trunk. то есть это плохо: /tags/version-1.0/trunk/stuff. Это хорошо: /tags/version-1.0/stuff.

Для этого я делаю 2 этапа:

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
1 голос
/ 04 ноября 2008

Ты очень, очень близко:

svn copy -m"Copy Directory" file:///path/to/a_folder file:///path/to/another_folder

просто удалите /* из первого аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...