В SVN, как мне скопировать только подкаталоги каталога в другой каталог?

StackOverflow https://stackoverflow.com/questions/260658

  •  06-07-2019
  •  | 
  •  

Вопрос

Обычно я делаю это через командную строку:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top