Можно ли выполнить Mercurial для сохранения прав доступа к файлам?
Я видел несколько сообщений в блоге и испытал для себя, что Mercurial не сохраняет разрешения на файлы, перетаскиваемые из одного репо в другое. Кто-нибудь знает о расширении Mercurial, которое сохранит разрешения? Я предполагаю, что это невозможно сделать с помощью крючка, потому что то, что крючок знает о разрешениях при исходном репо?
Запрошенная разработка:
-
Если единственным изменением в файле является изменение разрешений (например, chmod o+r filename
), попытки передать файл сбой сообщением о том, что файл не изменился.
-
Если я фиксирую файл с разрешениями 600 (rw -------), затем клонирует репо, тот же файл в клоне имеет разрешения 664 (rw-rw-r -):
: [email protected] 6522 ; hg clone one two
updating working directory
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
: [email protected] 6523 ; ls -l one two
one:
total 4
-rw------- 1 nr nr 8 Aug 18 21:50 foo
two:
total 4
-rw-rw-r-- 1 nr nr 8 Aug 18 21:51 foo
Эти примеры показывают, что hg clone
не сохраняет разрешения, но hg push
также не сохраняет их.
В моем приложении одно репо находится на общедоступном пути, и важно, чтобы
-
Несколько пользователей имеют право изменять репо
-
Файлы в публичном репо становятся доступными для чтения только тогда, когда они явно читаются.
Ответы
Ответ 1
Похоже, что это можно сделать с помощью крючков и вспомогательного инструмента (и небольшой жевательной резинки и пакетировочной проволоки):
-
Получить David Hardeman Metastore, который сохраняет и восстанавливает метаданные файлов.
-
Измените источники, чтобы они игнорировали каталог .hg
, а также .git
.
-
Используйте следующие крюки Mercurial:
precommit.meta = metastore -s
changegroup.update = hg update
update.meta = /usr/unsup/nr/bin/metastore -a
Вам нужно добавить файл .metadata
в репо.
Этот lashup будет работать большую часть времени, но если вы измените только разрешения и хотите его развернуть, вам нужно будет запустить metastore -s
, чтобы вставить эти изменения в файл .metadata, где hg увидит изменение; иначе коммит не считает, что ничего нового не было.
Ответ 2
Как использовать это решение из Mercurial FAQ:
Если вы используете Mercurial для конфигурации управления файлами, вы можете захотеть свойства файла отслеживания (собственность и разрешения). Только Mercurial отслеживает исполняемый бит каждого файл.
Вот пример того, как сохранить свойства вместе с файлами (работает на Linux, если у вас есть пакет acl установлен):
# cd /etc && getfacl -R . >/tmp/acl.$$ && mv /tmp/acl.$$ .acl
# hg commit
Это далека от совершенства, но вы получаете идею. Для более сложного решения, проверить etckeeper.
Ответ 3
Для конкретного случая каталога /etc etckeeper выглядит интересным.
Ответ 4
Не рекомендуется хранить разрешения в VCS. Однако Mercurial поддерживает "исполняемый" флаг (это не то же самое, что разрешения, хотя в исполняемом флаге Unix входит часть разрешений).