Нормально ли, что внешние файлы SVN не фиксируются?

Я новичок в Subversion и недавно научился автоматически импортировать файлы, принадлежащие другим репозиториям, используя svn:externals. И теперь, когда я фиксирую папку ствола и создаю тег для создания моментального снимка проекта, файлы/папки, определенные как внешние, не будут добавлены в папку тега.

Например, у меня есть такая структура папок

Z:\репо\репоА

Z:\repos\repoB

Z:\Проекты\воркБ

Я установил svn:externals на Z:\Projects\workB на file:///Z:/repos/repoA/trunk/lib trunk/lib, чтобы папка lib repoA автоматически добавлялась в текущий рабочий каталог, Z:\Projects\workB\trunk. И на самом деле, когда я выполняю SVN Update, папка lib создается в папке trunk.

После редактирования некоторых файлов и выполнения SVN Commit... на Z:\Projects\workB\trunk я выбрал TortoiseSVN -> Branch/Tag в контекстном меню. В поле To Path введите tags/1.0.1 и нажмите OK. Тег 1.0.1 успешно создан.

После того, как я выполнил SVN Update на Z:\Projects\workB\tags, появилась папка с именем 1.0.1, но без внешних файлов.

Это нормально? Я ожидал, что импортированные файлы также будут там, поскольку они находятся в папке trunk рабочего каталога.


Я создал два общедоступных репозитория на Assembla, чтобы каждый мог это проверить.

Второй репозиторий имеет определение externals, которое извлекает папку lib из первого репозитория. Когда я создаю тег текущих файлов магистрали из второго репозитория, он не добавляет внешние файлы в папку тегов. Кроме того, когда я извлекаю папку тегов, внешние файлы не добавляются в локальную рабочую копию.


person Teno    schedule 16.10.2012    source источник
comment
Вы не должны совершать внешние действия. Принятие внешнего решения подразумевает, что оно не является внешним, а является активной частью вашего текущего проекта.   -  person Dunes    schedule 16.10.2012
comment
@Dunes - вы совершенно, совершенно, совершенно не правы. Коммит во внешний ресурс разрешен, возможен, обязателен и, кроме того, НЕ СВЯЗАН с проблемой OP   -  person Lazy Badger    schedule 16.10.2012
comment
Я не говорил, что это невозможно, я просто сказал, что это плохая идея. Существует бесконечное множество вещей, которые возможны, но являются плохими идеями. Концептуальная идея внешних зависимостей заключается в том, чтобы иметь возможность отслеживать зависимости версий между вашим проектом и его внешними зависимостями. Он не предназначен для помощи в администрировании нескольких репозиториев как одного. Но вы правы, это не имело отношения к его проблеме. Я вижу это сейчас.   -  person Dunes    schedule 16.10.2012
comment
svn:externals - это хак, которым часто злоупотребляют. Вы действительно не хотите использовать их в качестве системы управления зависимостями для бедняков, если вы «владеете» исходным кодом для всех проектов. Если вы должны использовать внешний элемент, сильно подумайте об использовании только внешних элементов, источником которых является тег. Бесит невозможность откатить вашу рабочую копию до предыдущего состояния (внешний по-прежнему указывает на ствол — вы ничего не откатили). Какой язык/инструмент вы используете? Посмотрите на ivy/maven/nuget или что-то подобное. поверьте мне - svn:externals не путь.   -  person thekbb    schedule 17.10.2012
comment
@thekbb What language/tooling are you using? - В настоящее время я пишу код на PHP. Я понимаю вашу точку зрения, что это будет проблемой, если импорт файлов изменится. В моем случае это все мои файлы, которые я создал, включая файлы библиотеки. И на самом деле мне нужно обновить второй проект, если первый проект обновится. Так что в данном конкретном случае svn:externals кажется идеальным решением. Спасибо за ваше понимание.   -  person Teno    schedule 18.10.2012
comment
@thekbb, re - невозможность откатить рабочую копию до предыдущего состояния сводит с ума, привязка внешних версий решает эту проблему.   -  person cp.engr    schedule 01.10.2015


Ответы (2)


Когда вы устанавливаете свойство externals, файлы из внешнего репозитория не копируются в ваш рабочий репозиторий. Скорее, он просто создает «заметку» о том, откуда в будущем можно получить эти файлы.

Таким образом, когда вы создаете свой тег, svn не копирует фактические файлы, на которые есть внешние ссылки. Вместо этого он просто копирует «заметку». Если бы вы выполнили извлечение каталога tags/1.0.1 (или обновление, если оно уже извлечено локально), вы бы заметили, что соответствующие внешние файлы будут правильно извлечены, даже если эти файлы не существуют в рабочем репозитории.

редактировать:

О, наконец-то я увидел проблему. Вы устанавливаете свой внешний в корневом каталоге, а не в магистральном каталоге.

Лучший способ увидеть svn — это просто файловая система, вся идея ствола, тегов и ветвей — это просто концептуальные идеи, и каждый каталог ничем не отличается от другого.

Таким образом, когда вы копируете ствол в каталог тегов, внешние свойства не передаются, поскольку они не являются частью каталога ствола (они только говорят помещать внешние элементы в ствол). Чтобы решить, вы должны удалить внешние свойства из корневого каталога и добавить их в ствол. При следующем создании тега внешние свойства должны быть переданы.

Следующая команда:

svn propget svn:externals file:///Z:/Projects/workB/trunk

должен вывести:

file:///Z:/repos/repoA/trunk/lib lib 
person Dunes    schedule 16.10.2012
comment
Спасибо за ответ. Were you to perform a checkout of your tags/1.0.1 directory (or an update if it is already locally checked out) then you would notice that it would correctly pull down the relevant externals even thought these files do not exist in the working repository - Кажется, в моей среде это не работает. Пожалуйста, проверьте этот тег 1.0.0 примера общедоступного репозитория, который я только что создал: assembla.com/code/subversion-troubleshoot-b/subversion/nodes/ Когда я проверяю этот тег, он вытаскивает только core_mod.txt. - person Teno; 17.10.2012
comment
To solve you should remove the external properties from the root directory and add them to trunk. - Вот оно. Спасибо. Теперь, когда я создаю тег, внешние файлы также копируются. - person Teno; 17.10.2012

Ваше ожидание правильное. Копия svn должна создавать 100% копию исходного объекта, т. е. внешнее определение (и содержимое) должно отображаться в теге

  1. Проверить svn ls -v -R file:///Z:/repos/repoB/tags/1.0.1
  2. Для облегчения проверки и устранения неполадок я предлагаю перейти в общедоступный набор репозиториев - для тестирования вы можете, например, создать на Assembla свободное пространство с двумя или более SVN-репозиториями.

Не имеет отношения к примечанию о проблеме: тег, по соглашению, используется как точка заморозки кода (позже из любой точки можно получить точно такой же код), но он означает, что вы также должны быть заблокированы все внешние элементы в состоянии создания тега. repos/repoA/trunk/lib — это ревизия HEAD, которая менялась со временем, и соответствующая ревизия (тег ссылки rev — lib rev) для тега 1.0.1 будет утеряна. Читать о PEG-ревизиях

Изменить

Протестировано репозиторий Assembla с расширением в багажнике. Тест не пройден:

>svn co https://subversion.assembla.com/svn/subversion-troubleshoot-b/trunk .
A    core_mod.txt
Checked out revision 4

только там мне пришлось проверить также папку /lib

Изменить2

Для репозитория subversion-troubleshoot-b: исправления применены к определению, создан правильно написанный тег (1.0.1) с внешней привязкой к PEG-ревизии

См. различия между транком и проверкой тегов

z:\>svn co https://subversion.assembla.com/svn/subversion-troubleshoot-b/
...

Fetching external item into 'subversion-troubleshoot-b\trunk\lib':
A    subversion-troubleshoot-b\trunk\lib\lib01.txt
Checked out external at revision 4.

Fetching external item into 'subversion-troubleshoot-b\tags\1.0.1\lib':
A    subversion-troubleshoot-b\tags\1.0.1\lib\lib01.txt
Checked out external at revision 2.

Checked out revision 7.

если вы позже измените библиотеку в связанном репо - ствол будет получать последнее содержимое папки, 1.0.1 - всегда будет с версией 2 библиотеки в subversion-troubleshoot

person Lazy Badger    schedule 16.10.2012
comment
Спасибо за ответ. svn ls -v -R file:///Z:/repos/repoB/tags/1.0.1 просто перечисляет файлы без внешних файлов. Я создал учетную запись Assembla и два общедоступных репозитория и протестировал их, но результат был таким же. См.: assembla.com/code/subversion-trouble-shooting/subversion /nodes и assembla.com/code/subversion-troubleshoot -b/subversion/nodes subversion-troubleshoot-b имеет внешние ссылки на subversion-trouble-shooting. - person Teno; 17.10.2012
comment
Пожалуйста, добавьте этого пользователя Assembla в качестве участника как минимум B-проекта. Я передам хорошее дерево в репо - person Lazy Badger; 17.10.2012
comment
Отправил приглашение. Спасибо за беспокойство. Проблема была решена установкой svn:externals в папку trunk, а не в корневую папку, как предлагали Дюны. Возможно, лучше оставить репозиторий дефектов для будущих читателей. - person Teno; 17.10.2012
comment
@Teno: исправлены ошибки в репозитории, добавлен тег good 1.0.1 - см. отличия - person Lazy Badger; 17.10.2012