2008-11-04 5 views
21

через командную строку, я обычно делаю это:В 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.

ответ

8

Считаете ли вы использование слияния svn?

Учитывая репо, как это:

trunk/a_folder/foo 
trunk/a_folder/bar 
trunk/new_folder/baz 

использовать эти команды, чтобы объединить Foo и бар каталогов:

cd trunk/new_folder 
svn merge -r1:HEAD http://svn/repo/trunk/a_folder . 
1

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

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

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

19

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

svn cp svn://my_project/vendor/1.1 svn://my_project/trunk

, потому что ствол уже существует, так что вы в конечном итоге с:

Использование 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 

Усиливая оболочки (Баш):

 
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

Я думаю, что вы хотите, чтобы содержимое соединительной линии попало в папку /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 
5

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

http://svn.haxx.se/users/archive-2004-12/1537.shtml

В основном то, что он говорит, что если целевая папка не существует в репо, вы получите contencts вашей исходной папки в папку назначения.

См. Ниже пример. Папка 07-03-2012 не существует в вашем репо. После выполнения команды ниже вы получите содержимое папки HEAD в 07-03-2012.

svn cp <URL>/HEAD/ <URL>/branches/07-03-2012 -m "test" 
Смежные вопросы