Подтвердить что ты не робот

Можно ли выполнить 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 также не сохраняет их.

В моем приложении одно репо находится на общедоступном пути, и важно, чтобы

  • Несколько пользователей имеют право изменять репо

  • Файлы в публичном репо становятся доступными для чтения только тогда, когда они явно читаются.

4b9b3361

Ответ 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 входит часть разрешений).