可以让Mercurial保留文件权限吗?
我看过很多博客文章,也亲身经历过,Mercurial不保留从一个回购协议推送到另一个回购协议的文件的权限。有人知道Mercurial扩展可以保留权限吗?我假设它不能用钩子来完成,因为钩子对原始repo的权限了解多少 要求的详细说明:可以让Mercurial保留文件权限吗?,mercurial,file-permissions,Mercurial,File Permissions,我看过很多博客文章,也亲身经历过,Mercurial不保留从一个回购协议推送到另一个回购协议的文件的权限。有人知道Mercurial扩展可以保留权限吗?我假设它不能用钩子来完成,因为钩子对原始repo的权限了解多少 要求的详细说明: 如果对文件的唯一更改是权限更改(例如,chmod o+r filename),则尝试提交文件失败,并显示一条消息,说明文件未更改 如果我提交了一个权限为600(rw----)的文件,那么克隆repo,克隆中的同一个文件的权限为664(rw-rw-r----):
- 如果对文件的唯一更改是权限更改(例如,
),则尝试提交文件失败,并显示一条消息,说明文件未更改chmod o+r filename
- 如果我提交了一个权限为600(rw----)的文件,那么克隆repo,克隆中的同一个文件的权限为664(rw-rw-r----):
hg clone
不保留权限,但hg push
也不保留权限
在我的应用程序中,一个回购协议是在一个公共可访问的路径上,这一点非常重要
- 多个用户有权更改回购协议
- 公共repo中的文件只有在显式设置为可读时才变得可读
- 获取David Hardeman的,它可以保存和恢复文件元数据
- 更改源代码,使其忽略目录
以及.hg
.git
- 使用以下Mercurial挂钩:
precommit.meta = metastore -s changegroup.update = hg update update.meta = /usr/unsup/nr/bin/metastore -a
您必须将
- 在VCS中存储权限不是一个好主意。但是,Mercurial支持“可执行”标志(这与权限不同,尽管在Unix中可执行标志是权限的一部分)。看起来可以使用挂钩和辅助工具(以及少量口香糖和捆扎线)来完成:
.metadata
文件添加到repo
此捆绑大部分时间都可以工作,但是如果您只更改权限并希望传播它,则必须运行
metastore-s
,以便将这些更改推送到.metadata文件中,hg将在其中看到更改;否则,提交认为没有什么是新的。从以下位置使用此解决方案如何:
如果您使用Mercurial进行配置
文件管理,您可能需要
跟踪文件属性(所有权和
权限)也是。只有水银
跟踪每个文件的可执行位
文件
下面是一个如何保存
属性以及文件(工作)
在Linux上,如果您有acl包
已安装):
这远非完美,但你明白了。要获得更复杂的解决方案,请查看etckeeper
对于/etc目录的具体情况,看起来很有趣。我假设metastore是由于作者网站上的链接而被放弃的,所以我将下面的链接直接放在repo的
.hc/hgrc
配置文件中:
[paths]
default = ...
[hooks]
# NOTE: precommit is different than pre-commit, see https://www.mercurial-scm.org/repo/hg/help/hgrc for list of hooks
pre-commit =
# export permissions
hg st -camn0 | sort -z | xargs -0 getfacl > .hg.hook.pre-commit.acl.export
hg add .hg.hook.pre-commit.acl.export
# export timestamps
hg st -camn0 | sort -z | xargs -0 stat > .hg.hook.pre-commit.stat.export
hg add .hg.hook.pre-commit.stat.export
update =
# import permissions
setfacl --restore=.hg.hook.pre-commit.acl.export
# import timestamps
# TODO: use touch to restore timestamps
一般来说,这可能不是一个好主意,但在我的应用程序中,权限是关键元数据,它们必须是正确的。DVCS不是理想的工具,但似乎是最好的工具。你能详细说明一下吗?我可以更改本地文件的权限,提交更改,将它们推送到克隆,克隆将在我更新它时更改权限。关键是我必须提交和更新。是否希望推送到克隆仅从推送更改权限?要在不提交的情况下通知本地更改?推断所有现有权限?确切的问题是什么/我遗漏了什么?@quark:怎么做到的?我在DebianLinux上使用HG1.2.1,我甚至不能让它承认permissinos的更改是值得提交的更改。(注意,我已经按照你的要求进行了详细阐述。)诺曼:事实证明,我缺少的是你想要保留更改为“r”和“w”的事实,而我所说的是更改为“x”(Mercurial从0.6开始跟踪)。我应该意识到你的意思是读/写不可执行。我同意不能轻松管理远程权限可能是一个真正的痛苦。在工作中,通过使用
setfacl
,可以绕过我们的许多权限问题,但它(a)要求您在服务器上实际进行更改,并且(b)更改权限仍然只是文件所有者的权限范围。(b) 这意味着,即使hg允许记录对“rw”的更改,它仍然需要运行setuid
才能在远程端进行更改,但存储库所有者除外。指向Devid Hardeman的链接已过时。新链接:顺便说一句。这里:又提到了一个工具git-cache-meta.sh
# cd /etc && getfacl -R . >/tmp/acl.$$ && mv /tmp/acl.$$ .acl
# hg commit
[paths]
default = ...
[hooks]
# NOTE: precommit is different than pre-commit, see https://www.mercurial-scm.org/repo/hg/help/hgrc for list of hooks
pre-commit =
# export permissions
hg st -camn0 | sort -z | xargs -0 getfacl > .hg.hook.pre-commit.acl.export
hg add .hg.hook.pre-commit.acl.export
# export timestamps
hg st -camn0 | sort -z | xargs -0 stat > .hg.hook.pre-commit.stat.export
hg add .hg.hook.pre-commit.stat.export
update =
# import permissions
setfacl --restore=.hg.hook.pre-commit.acl.export
# import timestamps
# TODO: use touch to restore timestamps