Это нормально, что внешние файлы 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, чтобы каждый мог проверить это.
- https://www.assembla.com/code/subversion-trouble-shooting/subversion/nodes
- https://www.assembla.com/code/subversion-troubleshoot-b/subversion/nodes
Второй репозиторий имеет внешнее определение, которое опускает 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% копию исходного объекта, т. е. внешнее определение (и содержимое) должно появиться в теге
- Проверьте
svn ls -v -R file:///Z:/repos/repoB/tags/1.0.1
- Чтобы упростить проверку и устранение неполадок, я предложу перейти к общедоступному репозиторию - для тестирования вы можете, например, создать на Ассембле свободное пространство с двумя или более репозиториями 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