Разветвленный каталог с частичным доступом для чтения
У меня есть хранилище SVN, используя Authz для контроля доступа. Структура выглядит так:
├── branches
│ └── bob
├── tags
└── trunk
└── A
├── B
│ └── README.txt
└── README.txt
Предположим, что authz предоставляет пользователю доступ на чтение к каталогу. A
но нет B
, и это не удается, когда я пытаюсь ветвиться A
:
[hidden]$ svn copy A ^/branches/bob/A1 -m 'Branching A to branches/bob/A1'
Adding copy of A
svn: E220001: Commit failed (details follow):
svn: E220001: Access denied
В журнале svnserve написано
Authorization Failed recursive read /trunk/A
Почему у svn есть такое ограничение и есть ли способ обойти? Почему он просто не игнорирует B
при разветвлении точно так же, как при оформлении заказа?
Если это оказывается невозможным, то каков лучший рабочий процесс для SVN с Authz? Выглядит, если ветвление не разрешено, единственный способ - все работают над транком, но это слишком глупо.
2 ответа
Первоначальная реализация SVN authz не проверяла целое поддерево при копировании, но добавилась позже для устранения этой дыры в безопасности
Таким образом, вывод таков: авторизация SVN не была разработана с самого начала, рано или поздно появилось много хакерских и грязных исправлений, которые в конечном итоге сделали ваш вариант использования неподдерживаемым. ИМХО, хорошая реализация должна просто отслеживать, откуда была скопирована ветка, а также проверять подлинность источника.
Я согласен, что ваш вариант использования полностью действителен, и Perforce хорошо поддерживает авторизацию на основе пути. К сожалению, вы не можете сделать это в SVN. Вы можете либо переключиться на Perforce, либо подождать, пока они улучшат authz.
У вас есть запрещающее разрешение для подузла B для этого пользователя, и запрещающие разрешения переопределяют разрешения на чтение.
Когда ветвление A, B не может быть пропущено (оно находится внутри A и, насколько SVN знает или заботится, оно является его частью). Вот почему вы не можете сделать это. Это на самом деле хорошо, что мешает вам, поскольку вы обычно не хотите ветку, которая пропускает папку из источника.
Для этого не должно быть обходного пути, такое поведение действительно имеет смысл. Чтобы успешно выполнить ветвление, вам нужно:
- переместить B за пределы A
- дать пользователю доступ к А и всему под ним
Я понимаю, что могут быть случаи, когда это разочаровывает, но если B - это то, что не зависит от A, или если кто-то, кто работает на A, не заботится о B или нуждается в доступе к B - в таком случае B не должен действительно быть внутри А.