Следуйте символическим ссылкам в SVN

У меня есть каталог linux (и мне не нужна проверка Windows):

/home/me/projects/project1

В этом проекте мне нужно, чтобы SVN (1.8.8) переходил по символической ссылке «link1»:

/home/me/projects/project1/link1/<some_directories_and_files>

Но SVN не позволяет мне этого сделать, он просто добавляет link1, но не его содержимое. Если я попытаюсь добавить его содержимое, я получаю сообщение об ошибке:

svn add link1/*
svn: E145001: Can't schedule an addition of '/home/me/projects/project1/link1/first_directory' below a not-directory node

Я попытался преобразовать ссылку1 в жесткую ссылку, но я тоже не могу этого сделать:

ln /path/to/my/linked/directory link1
ln: ‘/path/to/my/linked/directory’: hard link not allowed for directory

Есть идеи? Как вы справляетесь с такой конфигурацией? Мне просто нужно зафиксировать все от /home/me/projects/project1 из простого svn commit


person Cyrille    schedule 20.07.2014    source источник


Ответы (1)


Если я понимаю вашу проблему, у вас есть:

project1/
project1/link1 -> ../../some/where/else

Если вы делаете простой svn add link1, он добавляет запись символической ссылки в репозиторий subversion, но то, что вы пытаетесь выполнить, - это получить материал где-то еще в дереве.

Если это так, то вы боретесь в неправильном направлении, вы должны сделать настоящие файлы и каталоги под link1 и сделать символические ссылки на целевые местоположения в каталоге link1. Это было бы простым решением проблемы.

Другим решением было бы сделать местоположение ../../some/where/else самостоятельным местоположением svn и сделать link1 внешним определением для этого местоположения. Когда вы фиксируете в основном каталоге, внешние файлы будут зафиксированы одновременно, что позволит сохранить информацию; однако, чтобы обеспечить синхронизацию другого местоположения, вам необходимо обязательно обновить его до той же версии, что и сохраненные данные.

В моем случае на рабочем столе у ​​меня есть каталог настроек:

$HOME/settings

Это извлеченная копия каталога, содержащего .bashrc, .profile, .vimrc, .vim и т. д. файлы и папки из репозитория svn. Все файлы и каталоги моего профиля были символическими ссылками в эту папку, поэтому, например, .profile -> settings/.profile и т. д. Когда я вношу изменения, они отражаются в дереве svn, к которому я могу вернуться, чтобы убедиться, что я не потерять мои настройки конфигурации, когда я перехожу в другую систему.

Если вы действительно хотите, чтобы svn переходил по символическим ссылкам как по жестким ссылкам (вы не можете создавать жесткие ссылки на каталоги, потому что это было бы плохо™), то вам придется взломать исходный код клиента svn, чтобы он это делал. что вы хотели; но это будет кошмар обслуживания.

Вы могли превратить символическую ссылку в точку монтирования привязки, направленную на цель, но у этого есть свои проблемы — вам нужно быть root, чтобы сделать это, и в итоге это оставляет забавные записи в ваш /proc/mounts для этого:

mount --bind /absolute/path/to/some/where/else project1/link1

Монтирование привязки не работает при монтировании внутри дерева svn, поскольку изменения формата рабочей копии, внесенные в svn 1.7 — операции svn пытаются переместить файлы из .svn/tmp в целевую папку, которая будет ссылка на кросс-устройство. Обходной путь в этом случае - идти изнутри наружу, т.е.:

mount --bind project/link1 /absolute/path/to/somewhere/else

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

person Petesh    schedule 20.07.2014
comment
Отличный ответ. Я пойду с простым решением на данный момент. - person Cyrille; 20.07.2014
comment
О, я только что вспомнил, почему я сделал это так (символическая ссылка на внешний каталог внутри рабочей копии): мне нужно было, чтобы пользователь www-data мог записывать файлы в этот каталог. Поскольку я не хочу менять разрешения в моем домашнем каталоге вплоть до моей рабочей копии, я думаю, мне придется просмотреть ваши альтернативные решения... - person Cyrille; 21.07.2014
comment
лол, Пит, угадай, какая символическая ссылка привела меня сюда? ;-) Давайте svn переместим его скорее! - person gatopeich; 05.11.2016
comment
Хм, mount --bind не работает с svn1.7.14 или 1.9.3, так как я получаю svn: E000018: Can't move ...: Invalid cross-device link - person zhao; 10.03.2021
comment
Поведение, похоже, изменилось в svn 1.7, поэтому смонтированная папка внутри дерева svn больше не работает. Делая наоборот - сделайте целевую папку привязанным монтированием части проверенного дерева, вы должны достичь желаемого эффекта. - person Petesh; 10.03.2021