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

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

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

Z:\ репо \ repoA

Z:\ репо \ repoB

Z:\ Projects \ workB

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

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

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

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


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

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

2 ответа

Решение

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

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

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

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

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

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

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

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

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

file:///Z:/repos/repoA/trunk/lib lib 

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

  1. Проверьте svn ls -v -R file:///Z:/repos/repoB/tags/1.0.1
  2. Чтобы упростить проверку и устранение неполадок, я предложу перейти к общедоступному репозиторию - для тестирования вы можете, например, создать на Ассембле свободное пространство с двумя или более репозиториями 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 папку

Edit2

Для репозитория 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.

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

Другие вопросы по тегам