Может ли клиент Subversion (svn) игнорировать символические ссылки, как если бы они были файлами?

У меня есть каталог в системе Linux, в основном содержащий символические ссылки на файлы в другой файловой системе. Я хотел бы добавить каталог в репозиторий Subversion, разыменовывая символические ссылки в процессе (рассматривая их как файлы, на которые они указывают, а не ссылки). Как правило, я хотел бы иметь возможность обрабатывать любые операции с рабочей копией с таким поведением, но команда "svn add" начинается там, где я начинаю.

У клиентской утилиты SVN нет никаких параметров, связанных с разыменованием symlink в рабочей копии. Я не нашел ссылок на это в руководстве (http://svnbook.red-bean.com/en/1.5/index.html).

Я нашел плакат в списке рассылки пользователей SVN, который задал тот же вопрос, но так и не получил ответа, здесь:

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

Я использую Subversion v1.6.1 на Fedora 11.

Для чего это стоит, я знаю, что существуют альтернативные инструменты/методы, которые могут помочь приблизиться к такому поведению, но которые я должен отбросить по различным причинам. Я уже рассматривал [и пылью] эти возможности:   - монтировка "union", объединяющая все каталоги, содержащие реальные файлы, с каталогом рабочей копии SVN как "верхний" слой в объединении;   - копирование/перемещение реальных файлов в ту же файловую систему, что и рабочая копия SVN, и использование жестких ссылок вместо символических ссылок;   - системы контроля версий, отличные от SVN. Это были все опрятные идеи, и я уверен, что они являются хорошими решениями для других проблем, но они не будут работать, учитывая ограничения этой среды и ситуации.

Ответ 1

У вас много ограничений, но есть одна вещь, которая всегда срабатывает: взломать источник.

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

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

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

Ответ 2

Идея: вставьте общую библиотеку, используя LD_PRELOAD, которая перехватывает stat/open/unlink и т.д., так что svn не видит символические ссылки. Это избавит вас от необходимости изменять источник svn.

Ответ 3

Вы также можете использовать физические ссылки вместо символических ссылок.

Ответ 4

Насколько я знаю, с текущей версией subversion (1.6.x) нет никакого способа сделать это. Если бы это были файлы (не каталоги) в одной файловой системе, вы могли бы использовать жесткие ссылки (без переключателя -s в команде ln).

Ответ 5

Я столкнулся с подобной проблемой. Мой домашний каталог содержит много сценариев в ~/scripts, разбросанных по различным подкаталогам. Тем не менее, я хотел, чтобы более чистый макет в SVN помог коллегам, которые просматривают вещи, ищущие примеры кода.

Я создал каталог ~/scripts/svn/signal15/code/ с подкатегориями prod и test под ним, а затем с жесткой связью все сценарии, рассеянные в другом месте.

Следующая команда затем импортировала нужную директорию/файл,

cd ~/scripts ; svn import svn http://svn_server/repos/codeкод >

Теперь репо показывает http://svn_server/repos/code/signal15/ с подкаталогами "prod" и "test".

Теперь у меня есть пользовательские макеты; a) Макет моего домашнего каталога остается неизменным (без подкаталога ~/scripts/svn) b) Репозиторий SVN содержит ветвь "signal15" с моими организованными скриптами. P.S: с функцией оболочки, я также могу проверить и проверить, если это необходимо.